无法将NULL插入到列中,但值不为空
所以即时尝试向实体添加实例时遇到了这个奇怪的问题。它是一个使用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();
而且这是我的订单班,我已经尝试过[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; }
}
示例项:
编辑:
我尝试设置的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; }
}
编辑:
,如果我做的OrderID NULLABALE并删除主键,我得到以下异常:
System.Data.Entity.Infrastructure.DbUpdateConcurrencyException:“商店更新,插入或删除语句影响意外数量的行(0)。自实体加载后,实体可能已被修改或删除。有关理解和处理乐观并发异常的信息,请参阅http://go.microsoft.com/fwlink/?LinkId=472540。'
但是这可以通过添加一个主键:(所以去除PK并使其NULLABLE心不是工作来解决。
此外,我需要分配给自己的GUID进一步的目的,从而让数据库分配GUID本身(与[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
)也不是一个选项。
你的问题是,你设置DatabaseGenerated
属性为OrderId
列。
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public string OrderId { get; set; }
有了这个属性EF会忽略值y ou设置为OrderId
,“try”生成唯一值,但在生成INSERT
查询时,生成唯一值将不适用于string
和OrderId
将为NULL
。
如果你是“第一码”使用EF然后更改的OrderId
类型Guid
和代码
order.OrderId = Guid.NewGuid().ToString();
删除下一行并留下DatabaseGenerated
属性,因为它是。
当使用DatabaseGenerated
属性列 - 意味着该列的值将通过数据库来生成。
更改Order
类的结构后,需要相应更新数据库。如果您使用“代码优先”的方法,那么您需要生成迁移脚本并在数据库中运行它。在“数据库优先”的方法你需要手动更新数据库
即使你说删除DatabaseGenerated
属性并没有帮助,它将是最简单的解决方案,正如Ivan Stoev在评论中所建议的。
因为你自己使用Guid.NewGuid().ToString()
生成唯一的字符串。
看到[this](http://stackoverflow.com/questions/8855100/why-is-ef-trying-to-insert-null-in-id-column)不确定,但它可能会帮助你,祝你好运 –
您会得到非常明确的异常消息:_Cannot无法将值NULL插入到'OrderId'列中,因为列不允许为nulls_。只需设置列以允许“NULL”值。 – Fabio
身份字符串是无用 – brykneval