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

时间:2011-09-21 06:58:39

标签: 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调用中传递值

1 个答案:

答案 0 :(得分: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);

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

[DatabaseGenerated(DatabaseGeneratedOption.None)]