我在现有数据库表上定义了一个ID列设置为[Key]的模型类。该表的字段定义为主键,int,not null。它不是和身份栏。
在代码中创建新记录时,我在调用SaveChanges()方法之前在代码中设置ID列(到唯一值)。
该方法返回错误:
无法将值NULL插入列'xxx_id',表中 'xxx.dbo.xxxxxx';列不允许空值。 INSERT失败。该 声明已被终止。
似乎EF假定ID列是Identity列,因此不会将SQL调用中的ID传递给数据库。
有没有办法定义ID列来告诉EF它不是Identity列并在SQL调用中传递值
答案 0 :(得分:9)
您需要为该属性指定DatabaseGeneratedOption。在这种情况下,DatabaseGeneratedOption应为None。
我通常使用流利的配置完成此操作,如:
Property(p => p.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
..但看起来这也可以用属性指定。见http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.databasegeneratedoption%28v=vs.103%29.aspx
[DatabaseGenerated(DatabaseGeneratedOption.None)]