【发布时间】:2017-08-26 16:42:30
【问题描述】:
所以我在尝试向实体添加实例时遇到了这个奇怪的问题。它是一个使用 EF 6.0 的 asp.net 应用程序。
例外:
SqlException:无法将值 NULL 插入到列“OrderId”中, 表'BETA.MDF.dbo.Orders';柱子 不允许空值。插入失败。声明已终止。
我的代码:
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)])也不是一种选择。
【问题讨论】:
-
见this 不确定,但它可能会帮助你,祝你好运
-
您会收到非常清晰的异常消息:无法将值 NULL 插入到列“OrderId”中,因为列不允许空值。只需将列设置为允许
NULL值。 -
字符串的标识没有用
-
如果我设置为允许空值的列,那么它不能是主键,我想成为主键。
-
那你为什么将
NULL设置为标识列,目的是什么?
标签: c# sql asp.net entity-framework