实体框架代码第一个现有的数据库映射关系

时间:2016-06-27 11:37:51

标签: entity-framework ef-code-first

我有一个现有的数据库,我想以最简单的方式使用Entity Framework Code First。它只是一个小型数据库。

我创建了一个镜像数据库表的简单POCO类:

e.g。

enter image description here

public class Author
{
    [Key]
    public int AuthorID { get; set; }
    public string AuthorName { get; set; }
    public virtual ICollection<Books> Books { get; set; }
}

public class Books
{
    [Key]
    public int BookID { get; set; }
    public string BookName { get; set; }
    public int AuthorID { get; set; }

}

DbContext如下:

public class Entities : DbContext
{
    public Entities(string connString)
    : base(connString)
{
}
    public DbSet<Author> Authors { get; set; }
    public DbSet<Books> Books { get; set; }

当我运行我的应用程序,并从我的数据库中选择第一个作者时,将正确填充AuthorID和AuthorName属性。但是,未填充书籍集。相反,类型为&#39; System.Data.EntityCommandExecutionException&#39;以及内部例外:&#39;无效的列名称&#39; Author_AuthorID&#39;。

如何正确建立作者和图书之间的链接? (即一个到多个,一个作者可以有很多书)。我已经非常简单地创建了Code First - 没有任何迁移或自动生成,并希望保持简单。

非常感谢您的帮助, 马丁

3 个答案:

答案 0 :(得分:1)

在与作者表关联的上下文中,添加Author属性(不带单AuthorID属性无关紧要。):

public class Books
{
    [Key]
    public int BookID { get; set; }
    public string BookName { get; set; }
    public int AuthorID { get; set; }

    //add this(attribute is not needed if you use EF6 or higher):
    [ForeignKey("AuthorID")]
    public virtual Author Author  { get; set; }
}

答案 1 :(得分:1)

Fluent API方法:

modelBuilder.Entity<Author>().HasMany(a => a.Books).WithRequired().HasForeignKey(b => b.AuthorID);

更新: 使用这种流畅的API,您不必在课堂书籍中添加属性作者

如果要将Books设置为不需要,则必须将属性AuthorID设置为int?

    modelBuilder.Entity<Author>().HasMany(a => a.Books).HasForeignKey(b => b.AuthorID);

图书课程:

public class Books
{
    [Key]
    public int BookID { get; set; }
    public string BookName { get; set; }
    public int? AuthorID { get; set; }

}

答案 2 :(得分:0)

嗯,这很令人尴尬,我在帖子后几分钟找到答案。我会发布答案,而不是删除我的问题以防其他人帮助:

public class Books
{
    [Key]
    public int BookID { get; set; }
    public string BookName { get; set; }

    [ForeignKey("Author")]
    public int AuthorID { get; set; }     
    public Author Author { get; set; }

}