在Code First和非身份标识密钥上插入失败

Ste*_*hen 2 asp.net-mvc entity-framework-4 ef-code-first

我在现有数据库表上定义了一个ID列设置为[Key]的模型类.该表的字段定义为主键,int,not null.它不是和标识列.

在代码中创建新记录时,我在调用SaveChanges()方法之前在代码中设置ID列(到唯一值).

该方法返回错误:

无法将值NULL插入列'xxx_id',表'xxx.dbo.xxxxxx'; 列不允许空值.INSERT失败.该语句已终止.

似乎EF假定ID列是Identity列,因此不会将SQL调用中的ID传递给数据库.

有没有办法定义ID列来告诉EF它不是一个Identity列,并在SQL调用中传递该值

小智 9

您需要为该属性指定DatabaseGeneratedOption.在这种情况下,DatabaseGeneratedOption应为None.

请参阅:http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.databasegeneratedoption%28v=vs.103%29.aspx

我通常使用流畅的配置完成此操作,例如:

Property(p => p.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
Run Code Online (Sandbox Code Playgroud)

..但看起来这也可以用属性指定.请参阅http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.databasegeneratedoption%28v=vs.103%29.aspx

[DatabaseGenerated(DatabaseGeneratedOption.None)] 
Run Code Online (Sandbox Code Playgroud)