所以我在尝试向实体添加实例时遇到了这个奇怪的问题。它是一个使用 EF 6.0 的 asp.net 应用程序。
异常(exception):
SqlException: Cannot insert the value NULL into column 'OrderId', table 'BETA.MDF.dbo.Orders'; column does not allow nulls. INSERT fails. The statement has been terminated.
我的代码:
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();
这也是我的订单类,我已经尝试过[Database generated]
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(我删除了自身,但仍然遇到相同的异常。
这是我的新类(class):
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.Infrastruct.DbUpdateConcurrencyException:“存储更新、插入或删除语句影响了意外数量的行 (0)。自加载实体以来,实体可能已被修改或删除。请参阅http://go.microsoft.com/fwlink/?LinkId=472540有关理解和处理乐观并发异常的信息。'
但这可以通过添加主键来解决:(因此删除 PK 并将其设为 NULLABLE 是行不通的。
此外,为了进一步的目的,我需要自己分配 GUID,因此让数据库自己分配 GUID(使用 [DatabaseGenerate(DatabaseGenerateOption.Identity)]
)也不是一个选项。
最佳答案
你的问题是你设置了DatabaseGenerated
属性为OrderId
专栏。
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public string OrderId { get; set; }
使用此属性 EF 将忽略您设置为 OrderId
的值和“尝试”生成唯一值,但生成唯一值不适用于 string
和OrderId
将是NULL
当INSERT
生成查询。
如果您使用 EF“代码优先”,则更改 OrderId
的类型至Guid
并从代码中删除下一行
order.OrderId = Guid.NewGuid().ToString();
然后离开DatabaseGenerated
属性原样。
使用时DatabaseGenerated
列的属性 - 表示该列的值将由数据库生成。
更改 Order
的结构后类,您需要相应地更新数据库。如果您使用“代码优先”方法,那么您需要生成迁移脚本并针对数据库运行它。在“数据库优先”方法中,您需要手动更新数据库
即使你说删除 DatabaseGenerated
属性没有帮助,这将是 Ivan Stoev 在评论中建议的最简单的解决方案。
因为您使用 Guid.NewGuid().ToString()
自己生成唯一的字符串.
关于c# - 当值不为空时无法将 NULL 插入列中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43157126/