0

これはおそらく単純な初心者の間違いですが、私はそれを理解できないようです.

私はエンティティ フレームワーク (ef 5.0、.net 4.5) を使い始めようとしています。最初に既存のデータベースと EF コードを操作しようとしています。1 対多の関係を持つ 2 つの単純なクラス: clips と clip_ratings (各クリップにゼロまたは多数の評価が存在する可能性があります)。クラスの関連部分は次のとおりです。

public class clip
{
    public clip()
    {
        this.Ratings = new List<clip_ratings>();
    }

    public virtual ICollection<clip_ratings> Ratings { get; set; }

    public int clip_id { get; set; }
    public Nullable<int> clip_type { get; set; }
    // ...
 }

public class clip_ratings
{
    public int cr_id { get; set; }
    public int cr_clip_id { get; set; }
    // ...

    [ForeignKey("cr_clip_id")]
    public clip Clip { get; set; }
}

今、DBからいくつかのデータを読み取ろうとしています:

           var query = from b in db.clips
                        orderby b.clip_id where b.Ratings.Count > 1
                        select b;

            foreach (var item in query)
            {
                Console.WriteLine(item.Ratings.Count +" | "+item.clip_linktext);
            }

クエリは DB から正しい結果セットを返しますが、item.Ratings.Count でエラーが発生します。item.clip_linktext を出力しただけでは問題ありませんが、item.Ratings.Count では次のエラーが発生します。

メタデータ コレクション内の複数のアイテムが ID 'clip_ratings' と一致します。

私はすべての MS EF チュートリアルに従い、さらにいくつかの投稿を読んでみましたが、理解できないようです。ここの誰かがこれについて私を助けてくれることを願っています(そして、それは簡単に修正できます;))

更新: classMap.cs ソースの追加:

public class clipMap : EntityTypeConfiguration<clip>
{
    public clipMap()
    {
        // Primary Key
        this.HasKey(t => t.clip_id);
        // ...


        // Table & Column Mappings
        this.ToTable("clips");
        this.Property(t => t.clip_id).HasColumnName("clip_id");
        this.Property(t => t.clip_type).HasColumnName("clip_type");
        ...
     }
 }

public class clip_ratingsMap : EntityTypeConfiguration<clip_ratings>
{
    public clip_ratingsMap()
    {
        // Primary Key
        this.HasKey(t => t.cr_id);
        // Table & Column Mappings
        this.ToTable("clip_ratings");
        this.Property(t => t.cr_id).HasColumnName("cr_id");
        this.Property(t => t.cr_clip_id).HasColumnName("cr_clip_id");
        // ...
    }
}
4

2 に答える 2

2

と を次のようにclip_idcr_idでマークKeyAttributeRatingsます。InversePropertyAttribute

public class clip
{
    public clip()
    {
        this.Ratings = new List<clip_ratings>();
    }

    [InverseProperty("Clip")]
    public virtual ICollection<clip_ratings> Ratings { get; set; }

    [Key]
    public int clip_id { get; set; }
    public Nullable<int> clip_type { get; set; }
    // ...
 }

public class clip_ratings
{
    [Key]
    public int cr_id { get; set; }
    public int cr_clip_id { get; set; }
    // ...

    [ForeignKey("cr_clip_id")]
    public clip Clip { get; set; }
}

Code First のデータ注釈について読む

PS!一般的な命名規則名前のガイドラインを読むことを真剣に検討してください

于 2012-11-01T18:47:14.777 に答える
1

わかりました、この単純な例のほぼすべての部分をもう1時間いじった後、私は解決策を見つけました.明らかに、EFはコレクションが「Ratings」と呼ばれることを好まなかったようです.DBまたはコードにプロパティ/フィールドを持つ部分はありません/その名前の属性。

名前を評価ではなく投票に変更しました

    public clip()
    {
        this.Votes = new List<clip_ratings>();
    }

    public virtual ICollection<clip_ratings> Votes { get; set; }

すべてがうまく機能します。

それが、私がこれまでこの種のフレームワークを避けてきた理由だと思います。

はい、データベースを改造する機会があれば、命名規則に従うようにします。

誰かがレーティングでうまくいかなかった理由について十分な説明を持っている場合は、今後同様の状況を避けるために、それを聞きたい.

于 2012-11-01T21:10:57.270 に答える