2017-04-01 253 views
2

所以即时尝试向实体添加实例时遇到了这个奇怪的问题。它是一个使用EF 6.0的asp.net应用程序。无法将NULL插入到列中,但值不为空

例外:

SQLEXCEPTION:无法将NULL值插入列 '的OrderId', 表 'BETA.MDF.dbo.Orders';列 不允许有空值。 INSERT失败。该语句已终止。

我的代码:

User user = (User)Session["CurrentUser"]; 
BetaEntities entities = new BetaEntities(); 

Beta.Order order = new Beta.Order(); 
order.OrderId = Guid.NewGuid().ToString(); 
order.OrderDate = DateTime.Now; 
order.OrderedBy = user.UserId; 
order.HandledBy = entities.Users.Where(x => x.Rank > 0).Select(i => i.UserId).FirstOrDefault(); 

entities.Orders.Add(order); 

entities.SaveChanges(); 

我的表: enter image description here

而且这是我的订单班,我已经尝试过[Databasegenerated]

public partial class Order 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public string OrderId { get; set; } 
    public System.DateTime OrderDate { get; set; } 
    public int OrderedBy { get; set; } 
    public int HandledBy { get; set; } 
} 

示例项:

enter image description here 如果您需要更多详细信息,请告诉我。

编辑:

我尝试设置的OrderID的数据库数据类型,以UNIQUEIDENTIEFIER和更新的实体模型,数据库应产生的GUID(我删除本身,但我仍然得到同样的异常

这是我的新类:

public partial class Order 
{ 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public System.Guid OrderId { get; set; } 
    public System.DateTime OrderDate { get; set; } 
    public int OrderedBy { get; set; } 
    public int HandledBy { get; set; } 
} 

enter image description here

enter image description here

编辑:

,如果我做的OrderID NULLABALE并删除主键,我得到以下异常:

System.Data.Entity.Infrastructure.DbUpdateConcurrencyException:“商店更新,插入或删除语句影响意外数量的行(0)。自实体加载后,实体可能已被修改或删除。有关理解和处理乐观并发异常的信息,请参阅http://go.microsoft.com/fwlink/?LinkId=472540。'

但是这可以通过添加一个主键:(所以去除PK并使其NULLABLE心不是工作来解决。

此外,我需要分配给自己的GUID进一步的目的,从而让数据库分配GUID本身(与[DatabaseGenerated(DatabaseGeneratedOption.Identity)])也不是一个选项。

+0

看到[this](http://stackoverflow.com/questions/8855100/why-is-ef-trying-to-insert-null-in-id-column)不确定,但它可能会帮助你,祝你好运 –

+0

您会得到非常明确的异常消息:_Cannot无法将值NULL插入到'OrderId'列中,因为列不允许为nulls_。只需设置列以允许“NULL”值。 – Fabio

+0

身份字符串是无用 – brykneval

回答

2

你的问题是,你设置DatabaseGenerated属性为OrderId列。

[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
public string OrderId { get; set; } 

有了这个属性EF会忽略值y ou设置为OrderId,“try”生成唯一值,但在生成INSERT查询时,生成唯一值将不适用于stringOrderId将为NULL

如果你是“第一码”使用EF然后更改的OrderId类型Guid和代码

order.OrderId = Guid.NewGuid().ToString(); 

删除下一行并留下DatabaseGenerated属性,因为它是。
当使用DatabaseGenerated属性列 - 意味着该列的值将通过数据库来生成。

更改Order类的结构后,需要相应更新数据库。如果您使用“代码优先”的方法,那么您需要生成迁移脚本并在数据库中运行它。在“数据库优先”的方法你需要手动更新数据库

即使你说删除DatabaseGenerated属性并没有帮助,它将是最简单的解决方案,正如Ivan Stoev在评论中所建议的。
因为你自己使用Guid.NewGuid().ToString()生成唯一的字符串。

+0

如果我删除它,我仍然得到同样的异常 –

+0

有两件事情,从这个答案丢失:改变OrderId'的'类型'Guid',是的。但也要调整数据库中的列类型以匹配,并给它一个默认约束'newid()'(或'newsequentialid()')。 – hvd

+0

如果你删除它 - 它应该工作,如果数据库相应地更新。 – Fabio

相关问题