我有一个像这样的Person实体类型:
public partial class Person
{
public int PersonID { get; set; }
public byte Gender { get; set; }
public string IDNumber { get; set; }
}
当我为了将他保存到数据库而创建一个新Person时,主键PersonID设置为0,而不是null。
代码:
var theNewGuy = new MyEntities.Person();
在这一行之后,NewGuy.PersonID = 0.问题是,我如何告诉它插入一个新的Person并为其分配下一个可用的主键?显然,我不希望它为0,但是数据库中已经存在PersonID为0的Person;
保存代码:
Velo.People.Add(theNewGuy);
Velo.SaveChanges();//throws error
抛出异常: 违反PRIMARY KEY约束'PK_PERSON'。无法在对象'dbo.Person'中插入重复键。重复键值为(0)。 声明已经终止。
答案 0 :(得分:5)
主键不能为空。 PK必须是唯一的,而Null则不是。此外,int
不是可空类型,因此它的默认值为0。
EntityFramework应该能够确定PersonID
是Person
的关键,但为了防止在那里尝试粘贴[Key]
属性。此外,您可以通过将auto increment
属性添加到[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
属性来强制它为PersonID
列。
答案 1 :(得分:1)
由于PersonID
为int
,因此它永远不会是null
。因此Entity Framework
将0
指定为默认值。但不用担心 - 如果你将这样新创建的实体添加到数据库中,一切都会好的 - 它将被保存,根据已经在数据库中的内容给出新的PersonID
,内存中的实体将被刷新以反映新的id由数据库提供。
答案 2 :(得分:0)
如果定义public int? PersonID {get;组; (在对象类型中使用?)你可以使用null作为值。
然而,它是如何被评论的,一个主键不会为空,但也许在特殊情况下处于非中间状态是有用的。
如果要从数据库创建实体模型,作为主键,它不会为null,在数据库的设计中,您不能将此字段设置为可为空,因此必须添加“?”手动修改。