entity frameworkCTP 4.“不能将NULL值插入列” – 即使没有NULL值

我使用EF CTP 4.我有一个简单的控制台应用程序(用于testing目的),是使用EF插入一些数据到SQL数据库。

插入物品后,我遇到了问题

using(var context = GetContext()) { BOB b = new BOB(); b.Id = 1; context.Bobs.Add(b); context.SaveChanges(); } 

它会抛出错误: {“不能将NULL值插入到'Id'列,'TestDB.dbo.BOB'列;列不允许空值,INSERT失败。\ r \ n语句已经被终止。

该表只有1个字段的ID INT NOT NULL这是主键,而不是一个自动递增的ID。

在创buildDataContext的时候,我有这个configuration,这个configuration是被触发的。

 protected override void OnModelCreating(ModelBuilder builder) { builder.Entity<BOB>().HasKey(b => b.Id); builder.Entity<BOB>().MapSingleType().ToTable("BOB"); } 

我也预先填充了这个表,然后通过debugging器能够通过监视加载这个BOB对象…所以我真的难住,至于能够加载我的BOB表明,一切都是正确的…但是插入一个新的它崩溃…

你有没有明确指定StoreGeneratedPattern

 modelBuilder.Entity<BOB>() .HasKey(p => p.Id) .Property(p => p.Id) .StoreGeneratedPattern = StoreGeneratedPattern.None; builder.Entity<BOB>().MapSingleType().ToTable("BOB"); 

我在这里有同样的问题,这真是一个丑陋的解决scheme。

  [Key] public Int64 PolicyID { get; set; } 

这不是一个自动生成的号码

然后我碰到了同样的错误。

EF代码第一CTP5

应用此之后:

  [Key] [DatabaseGenerated(DatabaseGeneratedOption.None)] public Int64 PolicyID { get; set; } 

那么它会工作。

我使用EF 4.1,模型优先,并遇到了这个问题。 以下是我解决它的方法:

当使用模型devise器表面时,当你创build一个实体时,你必须定义一个'Key'属性,它默认为Id,int32。

在我的情况下,我select了使用Guids作为Id,所以我将int32转换为Guid。 但是,如果在创build实体后检查此Id,则看到Id的“StoreGeneratedPattern”已选中“标识”。 起初我并不认为这是一个问题,但是当我检查用于插入到数据库中的SQL时,有点奇怪,因为它没有发送我的ID。 令人沮丧!

但是,一旦我回去,并将“StoreGeneratedPattern”从“身份”更改为“无”,重新生成数据库和重build项目,这奇怪{“不能插入价值NULL列'Id',表'TestDB.dbo.BOB ';列不允许为空,INSERT失败。\ r \ n声明已经终止。“}停止发生。

仅供参考 – 查看SQL一些看起来,如果你有'身份'select'StoreGeneratedPattern',EF保存对象的数据库(无标识),然后立即取回身份,并将其保存回您的对象。 即“StoreGeneratedPattern”的这个select依赖于数据库来生成你的ID,而不是你的代码!

它发生在我的数据库模式中的受尊重的列(标识列)上缺less主键时。 我在SQL服务器之间导出数据,使用SSMS导出工具并创build一个新的数据库,但没有意识到它只导出数据,没有密钥。

你可以发布你的C#代码的BOBtypes? 具体来说,“Id”属性的types是什么? 按照惯例,Code First将使任何称为Id或TypeName + Id的proeprty成为一个“int”的标识。 不过,我不清楚为什么你会在这种情况下得到一个exception,所以我想看看你的类定义。

根据您的其他问题,在一个项目中使用多个DbContexttypes是完全支持的,并且可以在CTP4和CTP5中正常工作。

我知道这个问题有些过时,已经find了一个可以接受的解决scheme,但是我认为如果我分享我的发现,这将是有用的。

我今天有这个错误,因为我使用了同一个DataContext两个不同的实例。 我正在用一些属性创build一个新的模型 – 这些属性的值是使用DataContext一个实例从数据库中加载的,然后我试图将这个新创build的模型调入数据库,先调用Add()然后调用SaveChanges() DataContext不同实例。 在开始使用相同的实例获取属性的值并实际添加和保存新对象之后,所有事情都开始工作了。