因此尝试向实体添加实例时遇到这个奇怪的问题。它是一个使用EF 6.0的asp.net应用程序。
例外:
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并使其无效也无法正常工作。
此外,我需要自己分配给GUID用于进一步的目的,因此让数据库分配guid本身(使用[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
)也不是一种选择。
答案 0 :(得分:2)
您的问题是您将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()
自行生成唯一字符串。