我使用Entity Framework 4.1,SQL Server 2008& .NET 4.0
我有一个Sql表:
create table SchemaVersion (
Version int not null,
constraint PK_SCHEMAVERSION primary key (Version)
)
和POCO
[Table("SchemaVersion")]
public class SchemaVersion
{
[Key]
public Int32 Version { get; set; }
}
我在表格中添加了列
Context ctx = new Context();
ctx.SchemaVersions.Add(new SchemaVersion() { Version = 2 });
ctx.SaveChanges();
我得到例外后:
无法将值NULL插入列'Version',表中 'Simply.dbo.SchemaVersion';列不允许空值。 INSERT失败。 声明已经终止。
上下文设置:
public class Context : DbContext
{
public DbSet<SchemaVersion> SchemaVersions { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
this.Configuration.ValidateOnSaveEnabled = false;
base.OnModelCreating(modelBuilder);
}
}
我觉得很奇怪,谁能帮我解决这个问题
答案 0 :(得分:4)
尝试禁用密钥的数据库生成:
[Table("SchemaVersion")]
public class SchemaVersion
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public Int32 Version { get; set; }
}
在向数据库添加新实体时,您似乎希望手动提供Version
值。默认情况下,EF假定类型int
的键是数据库中的标识,并将在那里生成。因此EF不会向数据库发送值。如果密钥不是DB中的标识,则根本不会提供密钥的值,从而导致异常。如果设置DatabaseGeneratedOption.None
,EF会将您设置的值作为密钥发送到数据库。