0

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

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

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

           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");
        // ...
    }
}
4

2 回答 2

2

用和标记clip_id和属性,如下所示:cr_idKeyAttributeRatingsInversePropertyAttribute

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

好的,在对这个简单示例的每个部分进行了一个小时的处理之后,我找到了一个解决方案:显然 EF 不喜欢被称为“评级”的集合,即使数据库或代码中没有任何部分具有属性/字段/该名称的属性。

将名称更改为投票不是评级

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

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

一切正常。

猜猜这就是为什么我到目前为止一直避免使用这些框架,你永远不会真正知道它们在幕后做什么;)

是的,如果我有机会改造数据库,我会尝试遵循命名约定。

如果有人对为什么它不适用于评级有很好的解释,我仍然希望听到它,以便能够避免将来出现类似情况。

于 2012-11-01T21:10:57.270 回答