4

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

public partial class Person
{    
    public int PersonID { get; set; }
    public byte Gender { get; set; }
    public string IDNumber { get; set; }
}

当我创建一个新的人以将他保存到数据库时,主键 PersonID 设置为 0,而不是 null。

编码:

var theNewGuy = new MyEntities.Person();

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

保存代码:

Velo.People.Add(theNewGuy);
Velo.SaveChanges();//throws error

抛出异常: 违反主键约束“PK_PERSON”。无法在对象“dbo.Person”中插入重复键。重复键值为 (0)。该语句已终止。

4

3 回答 3

5

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

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

于 2013-04-19T13:44:54.500 回答
1

既然PersonIDint它永远不可能null。因此Entity Framework分配0为默认值。但不用担心 - 如果您将这样新创建的实体添加到数据库中,一切都会好起来的 - 它会被保存,PersonID根据数据库中已有的内容给出新的,并且内存中的实体将被刷新以反映数据库给出的新 id。

于 2013-04-19T13:44:53.070 回答
0

如果你定义 public int? 人名 { 得到;放; }(在对象类型中使用 ?)你可以使用 null 作为值。

但是,它是如何被评论的,主键它不会为空,但也许在你的特定情况下处于迭代状态是有用的。

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

于 2013-04-21T09:07:25.047 回答