首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实体框架一对多映射

实体框架一对多映射
EN

Stack Overflow用户
提问于 2012-11-01 18:34:14
回答 2查看 2.4K关注 0票数 0

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

我只是尝试开始使用实体框架(ef5.0,.net 4.5),直到现在我一直在滚动我自己的所有sql语句。我首先尝试使用现有的数据库和EF代码,使用两个简单的类,它们具有一对多的关系: clips和clip_ratings (每个剪辑可以有0或多个评分)。课程的有关部分如下:

代码语言:javascript
复制
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读取一些数据:

代码语言:javascript
复制
           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,我得到了以下错误:

元数据集合中的多个项与标识“剪辑_评级”匹配。

我已经尝试了所有的MS教程,阅读了一些更多的帖子,但似乎无法弄清楚。希望这里有人能在这方面帮助我(而且它很容易修复;)

更新:添加classMap.cs源:

代码语言:javascript
复制
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");
        // ...
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-01 21:10:57

好的,在这个简单例子的每一个部分花了一个小时之后,我找到了一个解决方案:显然EF不喜欢这个集合被称为“评级”,尽管DB或任何地方的代码中都没有这个名称的属性/字段/属性。

将名称更改为 name ,而不是Ratings

代码语言:javascript
复制
    public clip()
    {
        this.Votes = new List<clip_ratings>();
    }

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

一切都很好。

我猜这就是为什么到目前为止我一直回避这种框架的原因,你永远不知道它们在做什么;)

是的,如果我有机会对db进行重新建模,我将尝试遵循命名约定。

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

票数 1
EN

Stack Overflow用户

发布于 2012-11-01 18:47:14

clip_idcr_id标记KeyAttribute,用InversePropertyAttribute标记Ratings属性,如下所示:

代码语言:javascript
复制
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; }
}

阅读关于代码优先数据注释的文章

PS!认真考虑阅读一般命名公约姓名指南

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13183398

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档