【问题标题】:Cannot insert the value NULL into column in ASP.NET MVC Entity Framework无法将值 NULL 插入 ASP.NET MVC 实体框架中的列
【发布时间】:2013-11-01 13:04:40
【问题描述】:

尝试使用此代码时:

var model = new MasterEntities();

var customer = new Customers();
customer.Sessionid = 25641;

model.Customers.Add(customer);
model.SaveChanges();

我明白了:

{"无法将值 NULL 插入到列 'Sessionid', 表中 'master.dbo.Column';列不允许空值。插入 失败。\r\n语句已终止。"}

“Sessionid”列实际上是主键,用[KEY]标记如下:

 public class Customers
    {   
        [Key]
        public long Sessionid { get; set; }
        public long? Pers { get; set; }
    }

所以根据this 的问题,似乎当属性标记为[KEY] 时,EF 忽略了我自己的 Sessionid 声明,因为它希望数据库分配值。

那么我该如何解决呢?如果我删除 [KEY] 我会得到 "entity type has no key defined" 异常...

【问题讨论】:

标签: c# asp.net entity-framework


【解决方案1】:

我通过像这样添加[DatabaseGenerated(DatabaseGeneratedOption.None)] 解决了这个问题:

public class Customers
    {   
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.None)]
        public long Sessionid { get; set; }
        public long? Pers { get; set; }
    }

【讨论】:

  • 我找不到 DatabaseGenerated 的 dll
  • @JohnNguyen DatabaseGeneratedDatabaseGeneratedOption 都在 System.ComponentModel.DataAnnotations.Schema 命名空间中,这是 EntityFramework 的一部分。确保您有对 EF 的引用或安装了 EF NuGet 包。
  • 太棒了——谢谢您,先生!尝试了 4 个小时的不同变体,直到我遇到了您的出色解决方案!
【解决方案2】:

您可以将 SQL 配置为在插入时自动生成(并自动增加)表的主键。然后只需在C#中删除[Key],您无需在应用程序中手动设置ID,db会为您生成。

【讨论】:

  • 您是否有特定的原因要这样做?从设计的角度来看,这不是“通常”的规范 - 您仍然可以让 SQL 生成一个通用 ID 列作为 pKey 并手动设置您自己的“sessionID”,就好像它是一个常规(非键)列一样。 .?
  • 是的,有一个特定的原因 :) 但是在评论中很难进入这里 :)
  • 听起来像是 Dean Varillas 经常做的那种事情……导致我退出了。
【解决方案3】:

我在使用Microsoft SQL Server 时多次遇到此问题,我已按照相同的方法修复它。要解决此问题,请确保将 Identity Specification 设置为 Yes。下面是它的样子:

通过这种方式,列号自动递增作为主键通常会。

HOW?: 右键单击包含该列的表,选择设计选择主键并在 Column Properties 窗口中找到 Identity Specification 并将其设置为 Yes

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-05
    • 2011-05-25
    • 1970-01-01
    • 2015-10-18
    • 2012-09-25
    • 1970-01-01
    • 2017-03-05
    • 1970-01-01
    相关资源
    最近更新 更多