【问题标题】:Entity's primary key field is set to 0 instead of null实体的主键字段设置为 0 而不是 null
【发布时间】:2013-04-19 13:42:00
【问题描述】:

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

【问题讨论】:

  • PersonID 在您的数据模型中是否被注释为身份?
  • 不。大概就这么简单,我会改过来告诉你的。
  • 看到它是一个partial 类.. 类的其余实现是什么?也许它与您发布的代码有冲突?
  • 为什么不将 PersonId 设为 autoIncrement 和 Unique?,我认为它会起到作用。
  • 如果可能的话,请给我们保存 theNewGuy 到数据库的代码。另外,请给我们抛出的异常,如果有的话。谢谢。

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 这就是它应该工作的方式,并且它对我来说已经工作了将近五年。但是,我收到以下 SQL 异常:“违反 PRIMARY KEY 约束 'PK_PERSON'。无法在对象 'dbo.Person' 中插入重复键。重复键值为 (0)。语句已终止。”这就是我在这里寻求帮助的原因。
    • 您可能希望将此错误消息包含在您的问题中以避免混淆。有趣,从来没有这个问题。您使用的是普通的EFCode first
    • DB First 就像上帝的意图;)
    • 只是为了确定,您的 PK 列是否定义为 auto increment
    • EF 不应该在意。我的钱在 EF 上,没有将属性识别为键列和/或自动增量。检查我对 ID 生成选项属性的回答。
    【解决方案3】:

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

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

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

    【讨论】:

    • 有可能。我的问题是我想解决问题,而不是简单地在上面贴一些胶带。不过你的回答肯定有道理,谢谢。
    猜你喜欢
    • 2017-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 2018-05-13
    • 2017-06-20
    • 2014-10-02
    相关资源
    最近更新 更多