实体框架一对多映射

时间:2012-11-01 18:34:14

标签: .net entity-framework

这可能只是一些简单的初学者的错误,但我似乎无法弄明白。

我只是试图开始使用实体框架(ef 5.0,.net 4.5),直到现在才滚动我所有的sql语句。我首先尝试使用现有的数据库和EF代码,使用两个具有一对多关系的简单类:clip和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; }
}

现在我正在尝试从数据库中读取一些数据:

           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);
            }

查询从数据库返回正确的结果集,但是它在item.Ratings.Count上出错。当我输出item.clip_linktext时一切都很好,但是使用item.Ratings.Count我得到以下错误:

  

元数据集合中的多个项目与标识'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");
        // ...
    }
}

2 个答案:

答案 0 :(得分:2)

clip_idcr_id标记为KeyAttribute,将Ratings标记为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 Data Annotations

PS! 严重考虑阅读General Naming ConventionsGuidelines for Names

答案 1 :(得分:1)

好吧,经过另一个小时搞乱这个简单例子的每个部分后,我找到了一个解决方案:显然EF不喜欢这个集合被称为“评级”,即使数据库或代码中没有任何部分也没有属性/字段/该名称的属性。

将名称更改为投票而非评分更改为

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

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

一切正常。

猜猜这就是为什么到目前为止我已经避免使用这种框架,你真的不知道他们在幕后做了什么;)

是的,如果我有机会重新构建数据库,我将尝试遵循命名约定。

如果有人能够很好地解释为什么它不能与评级合作,我仍然希望听到它,以便能够在将来避免类似情况。