C# 无法在ASP.NET MVC实体框架的列中插入值NULL
尝试使用此代码时:C# 无法在ASP.NET MVC实体框架的列中插入值NULL,c#,asp.net,entity-framework,C#,Asp.net,Entity Framework,尝试使用此代码时: var model = new MasterEntities(); var customer = new Customers(); customer.Sessionid = 25641; model.Customers.Add(customer); model.SaveChanges(); 我得到: {无法将值NULL插入到表的列'Sessionid'中 'master.dbo.Column';列不允许null.INSERT 失败。\r\n语句已终止。} 列Sessio
var model = new MasterEntities();
var customer = new Customers();
customer.Sessionid = 25641;
model.Customers.Add(customer);
model.SaveChanges();
我得到:
{无法将值NULL插入到表的列'Sessionid'中
'master.dbo.Column';列不允许null.INSERT
失败。\r\n语句已终止。}
列Sessionid实际上是主键,并用[key]标记,如下所示:
public class Customers
{
[Key]
public long Sessionid { get; set; }
public long? Pers { get; set; }
}
public class Customers
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public long Sessionid { get; set; }
public long? Pers { get; set; }
}
所以,根据问题,似乎当属性标记为[KEY]时,EF忽略了我自己的Sessionid声明,因为它期望数据库分配该值
那么我该如何解决这个问题呢?如果我删除[KEY],我得到的实体类型没有定义键异常…您可以配置SQL,以便在插入时自动生成并自动递增表的主键。然后只需删除C中的[Key],您不需要在应用程序中手动设置ID,db将为您生成它。我通过添加[DatabaseGeneratedDatabaseGenerateOptions.None]解决了这个问题,如下所示:
public class Customers
{
[Key]
public long Sessionid { get; set; }
public long? Pers { get; set; }
}
public class Customers
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public long Sessionid { get; set; }
public long? Pers { get; set; }
}
在使用Microsoft SQL Server时,我多次遇到此问题,并采用相同的方法解决了此问题。要解决此问题,请确保将Identity Specification设置为Yes。下面是它的样子: 通过这种方式,列号通常会像主键一样自动递增
如何?:右键单击包含该列的表,选择“设计”,选择主键,然后在“列属性”窗口中“查找标识规范”并将其设置为“是”。您的表实际上称为列吗?在主数据库中?可能是SessionID的副本,可能有自动增量?我同意@Martin。我认为在映射数据库和类时出现了问题。不@MartinSmith不是:我只是编辑了它以使其更清晰。您想这样做的具体原因是什么?从设计的角度来看,这不是“一般”的标准-您仍然可以让SQL生成一个通用ID列作为pKey,并手动设置您自己的“sessionID”,就好像它是一个常规的非键列一样..?是的,有一个特定的原因:但是在注释中很难理解这一点:听起来像Dean Varillas经常做的事情。。导致我退出。我找不到dllDatabaseGenerated@JohnNguyenDatabaseGenerated和DatabaseGenerateOption都位于System.ComponentModel.DataAnnotations.Schema命名空间中,后者是EntityFramework的一部分。确保您有EF的参考资料或安装了EF NuGet软件包。太棒了-谢谢您,先生!我已经尝试了4个小时的不同版本,直到我发现了你的优秀解决方案!