我有一个名为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代码首先抛出错误。
问题: 如何在保持代码优先的同时在数据库模型中创建它来指定人员密钥?
感谢
答案 0 :(得分:1)
您的Person
课程是什么样的。 Person
需要名为Id或PersonId
的属性或标记为ID的属性。
您还需要标记外键:
public int PersonId { get; set; }
[ForeignKey("PersonId")]
public virtual Person Person { get; set; }
否则,实体框架往往不会认识到PersonId
与您的Person
属性相关。