实体的主键字段设置为0而不是null

时间:2013-04-19 13:42:00

标签: c# asp.net-mvc entity-framework

我有一个像这样的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)。 声明已经终止。

3 个答案:

答案 0 :(得分:5)

主键不能为空。 PK必须是唯一的,而Null则不是。此外,int不是可空类型,因此它的默认值为0。

EntityFramework应该能够确定PersonIDPerson的关键,但为了防止在那里尝试粘贴[Key]属性。此外,您可以通过将auto increment属性添加到[DatabaseGenerated(DatabaseGeneratedOption.Identity)]属性来强制它为PersonID列。

答案 1 :(得分:1)

由于PersonIDint,因此它永远不会是null。因此Entity Framework0指定为默认值。但不用担心 - 如果你将这样新创建的实体添加到数据库中,一切都会好的 - 它将被保存,根据已经在数据库中的内容给出新的PersonID,内存中的实体将被刷新以反映新的id由数据库提供。

答案 2 :(得分:0)

如果定义public int? PersonID {get;组; (在对象类型中使用?)你可以使用null作为值。

然而,它是如何被评论的,一个主键不会为空,但也许在特殊情况下处于非中间状态是有用的。

如果要从数据库创建实体模型,作为主键,它不会为null,在数据库的设计中,您不能将此字段设置为可为空,因此必须添加“?”手动修改。