【发布时间】:2011-01-13 16:34:04
【问题描述】:
我正在试用 Entity Framework 4 的 Code First (EF CodeFirst 0.8),但遇到了一个简单模型的问题,该模型在 Person 和 Profile 之间具有 1 0..1 关系.以下是它们的定义:
public class Person
{
public int PersonId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public DateTime? DOB { get; set; }
public virtual Profile Profile { get; set; }
}
public class Profile
{
public int ProfileId { get; set; }
public int PersonId { get; set; }
public string DisplayName { get; set; }
public virtual Person Person { get; set; }
}
数据库上下文如下所示:
public class BodyDB : DbContext
{
public DbSet<Person> People { get; set; }
}
我没有为Profile 定义DbSet,因为我认为People 是它的聚合根。当我尝试使用此代码添加新的Person - 甚至没有Profile 时:
public Person Add(Person newPerson)
{
Person person = _bodyBookEntities.People.Add(newPerson);
_bodyBookEntities.SaveChanges();
return person;
}
我收到以下错误:
当 IDENTITY_INSERT 设置为 OFF 时,无法为表“People”中的标识列插入显式值。
当我调用People.Add() 时,newPerson 对象的PersonId 属性具有0。数据库表是People 和Profiles。 PersonId 是People 的PK,是一个自增身份。 ProfileId 是 Profiles 的 PK 并且是一个自动增加的身份。 PersonId 是 Profiles 的非空 int 列。
我做错了什么?我认为我遵守了所有 EF Code First 的配置规则约定。
【问题讨论】:
-
我可能错了,但我相信标识列的默认约定是一个名为 Id 的属性,您是否尝试将 PersonId 更改为仅 Id
-
其实,我原本把所有的PK列都简单命名为Id。为了解决这个问题,我更改了它们,如我的帖子中所示。 Scott Gu 的原始代码帖子首先将 DinnerID 作为餐桌的主键 - weblogs.asp.net/scottgu/archive/2010/07/16/…
-
发生此错误的另一种方式是,如果您从另一个上下文中获取 [One] 实体,而不是在 [Many] 实体中设置它。 IE。这会得到错误:
ParentEntity parent;using (var db = new Context()) { parent = db.Parents.First(); }using (var db = new Context()) { db.Children.Add(new Child {Parent = parent});db.SaveChanges(); }要修复,只需在第二个上下文块中添加db.Children.Attach(parent)。
标签: entity-framework entity-framework-4