EF Code First模型引用现有模型

时间:2014-05-07 14:37:50

标签: c# entity-framework ef-code-first edmx

我有一个名为Person的现有实体。 Person实体具有ID。一个人可以自己存在。

在新的应用程序中,我正在创建一个名为Dog的实体。首先使用EF代码创建此新实体的数据库模型。 我现在想要添加狗必须拥有所有者的规则,Person。 一个人可以有很多狗。

我已经生成了edmx,以便在我的应用程序中使用PersonContext。

我现在想在两个实体之间做出正确的引用。

public class DogContext : DbContext
{
    public DogContext()
        : base("DefaultConnection")
    {
    }

    public DbSet<Dog> Dogs { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        //one-to-many 
        modelBuilder.Entity<Person>().HasMany<Dog>(p => p.Dogs).WithRequired(d => d.Person).HasForeignKey(u => u.DogId);
        base.OnModelCreating(modelBuilder);
    }
}


[Table("Dog")]
public class Dog
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int DogId{ get; set; }
    public string Name{ get; set; }

    public int PersonId { get; set; }

    public virtual Person Person { get; set; }
}

Person类是在.edmx文件中生成的,目前还不知道他拥有哪些狗。 现在最重要的是狗有一个主人,是一个人。

使用此设置我收到错误:

  

EntityType&#39; Person&#39;没有定义键。定义密钥   这个EntityType。 Person:EntityType:EntitySet   &#39;人&#39;基于类型&#39; Person&#39;没有钥匙   定义

我猜这是EF代码首先抛出错误。

问题: 如何在保持代码优先的同时在数据库模型中创建它来指定人员密钥?

感谢

1 个答案:

答案 0 :(得分:1)

您的Person课程是什么样的。 Person需要名为Id或PersonId的属性或标记为ID的属性。

您还需要标记外键:

public int PersonId { get; set; }

[ForeignKey("PersonId")]
public virtual Person Person { get; set; }

否则,实体框架往往不会认识到PersonId与您的Person属性相关。