【问题标题】:How to create One-to-many relationship in Entity Framework 4.1 using Code First and Data Annotations?如何使用 Code First 和 Data Annotations 在 Entity Framework 4.1 中创建一对多关系?
【发布时间】:2011-05-21 21:21:07
【问题描述】:

我正在努力使用 EF 中的 Code First 创建简单的一对多关系。我希望它为我生成数据库,但不知道如何编写这些类,所以它会创建它。

我有这些课程:

public class Book
{
    public int ID { get; set; }
    public string Author { get; set; }
    public ICollection<Page> Pages { get; set; }
}

public class Page
{   [Key]
    public int BookID { get; set; }

    public  Book Book { get; set; }

    public string OtherField { get; set; }
}

但是在生成数据库时出现错误:

无法确定类型“MvcApplication1.Models.Page”和“MvcApplication1.Models.Book”之间关联的主体端。此关联的主体端必须使用关系流式 API 或数据注释显式配置

我只想生成两个简单的表,以 ID 作为主键的“Book”和以 BookID 作为主键和外键的 Page。确实应该很简单,但我就是想不通。

【问题讨论】:

    标签: data-annotations ef-code-first entity-framework-4.1


    【解决方案1】:

    但这不是一对多的关系。这是一对一的关系,每本书只有一页。该错误表示它无法确定书或页面是否是一对一关系中的主体。

    您必须像这样修改您的实体:

    public class Book
    {
        public int ID { get; set; }
        public string Author { get; set; }
        public virtual ICollection<Page> Pages { get; set; }
    }
    
    public class Page
    {   
        public int ID { get; set; }
        public int BookID { get; set; }
        public virtual Book Book { get; set; }
        public string OtherField { get; set; }
    }
    

    【讨论】:

    • 您还可以将虚拟修饰符添加到 Pages 和 Book 属性,以便您获得延迟加载。
    • 但它会生成具有主键 ID 和外键 BookID 的 Pages 表。我怎样才能让它只生成BookId,即主键外键。
    • 你不能,因为在这种情况下它将是一对一的关系。主键只能在表中出现一次 - 值必须是唯一的,并且外键必须具有与相关父实体相同的值 = 如果你想为只有一页的书籍建模,你想要这个,但如果你想为多页的书籍建模您不能将 bookId 作为页面中的主键的页面。
    • 当然你是对的。我不知道我在想什么……我想我太累了。
    • 如果你想在做业务逻辑的时候添加一个页面怎么办?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-10
    • 2011-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-11
    • 1970-01-01
    相关资源
    最近更新 更多