C# 实体';s的主键字段设置为0而不是null

C# 实体';s的主键字段设置为0而不是null,c#,asp.net-mvc,entity-framework,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以将其保存到db时,主键PersonID被设置为0,而不是null 守则: var theNewGuy = new MyEntit

我有这样一个Person实体类型:

public partial class Person
{    
    public int PersonID { get; set; }
    public byte Gender { get; set; }
    public string IDNumber { get; set; }
}
当我创建一个新的Person以将其保存到db时,主键PersonID被设置为0,而不是null

守则:

var theNewGuy = new MyEntities.Person();
在这一行之后,newguy.PersonID=0。问题是,我如何告诉它插入一个新的人并为其分配下一个可用的主键?显然,我不希望它是0,但是数据库中已经有一个人的PersonID=0

保存代码:

Velo.People.Add(theNewGuy);
Velo.SaveChanges();//throws error
引发异常: 违反主键约束“主键人”。无法在对象“dbo.Person”中插入重复的密钥。重复的键值为(0)。
语句已终止。

因为
PersonID
int
它永远不能为
null
。因此,
实体框架
0
指定为默认值。但不用担心-如果您将这种新创建的实体添加到数据库中,一切都会很好-它将被保存,根据数据库中已有的内容提供新的
PersonID
,并且内存中的实体将被刷新以反映数据库提供的新id。

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


EntityFramework应该能够确定
PersonID
Person
的键,但为了以防万一,请尝试将
[key]
属性粘贴在那里。此外,您可以通过将
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
属性添加到
PersonID
属性,强制它成为一个
自动递增列。

如果您定义了public int?PersonID{get;set;}(在对象类型中使用?时)可以使用null作为值

然而,它是如何被注释的,一个主键它不会是空的,但是在您的特定情况下,在itermediate状态下可能是有用的


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

是否在数据模型中注释为标识的
PersonID
否。可能就这么简单,我会更改并让您知道。因为这是一个
部分
类。。类的其余实现中有什么?也许它与您发布的代码有冲突?为什么不将PersonId设置为自动递增和唯一?我认为这将起到作用。如果可能,请给我们将newguy保存到DB的代码。另外,如果有异常抛出,请告诉我们。谢谢。这就是它应该起作用的方式,也是我近五年来一直起作用的方式。但是,我得到以下SQL异常:“违反主键约束‘PK_PERSON’。无法在对象‘dbo.PERSON’中插入重复键。重复键值为(0)。语句已终止。”这就是我来这里寻求帮助的原因。您可能希望将此错误消息包括在问题中以避免混淆。有趣的是,从来没有过这个问题。您使用的是正常的
EF
code-first
?DB-first(如主所愿;)只是为了确定,您的PK列是否定义为自动递增?EF不必在意。我的钱花在EF上,因为EF没有将该属性识别为键列和/或自动增量。检查我的答案中的ID生成选项属性。这是可能的。我的问题是我想解决这个问题,而不是简单地在上面贴上胶带。但你的回答肯定有价值,谢谢。