实体框架CTP 4."无法将值NULL插入列" - 即使没有NULL值

Sec*_*rel 53 c# entity-framework ctp4

我正在使用EF CTP 4.我有一个简单的控制台应用程序(用于测试目的),它使用EF将一些数据插入SQL数据库.

我在插入物品时遇到了问题

using(var context = GetContext())
{
   BOB b = new BOB();
   b.Id = 1;

   context.Bobs.Add(b);
   context.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)

它抛出错误:{"无法将值NULL插入列'Id',表'TestDB.dbo.BOB';列不允许空值.INSERT失败.\ r \n语句已终止."}

该表只有1个Id int NOT NULL字段,它是主键,不是自动递增的Id.

在创建DataContext时,我有这个配置,肯定会被触发.

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

我还预先填充了这个表,然后通过调试器能够通过监视加载这个BOB对象...所以我真的很难过,因为能够加载我的BOB显示一切都是正确的...但是插入一个新的崩溃...

小智 70

我在这里有同样的问题,这真的是一个丑陋的解决方案.

 [Key]
public Int64 PolicyID { get; set; }
Run Code Online (Sandbox Code Playgroud)

这不是自动生成的数字

然后我遇到了同样的错误.

EF Code First CTP5

申请后:

 [Key]
 [DatabaseGenerated(DatabaseGeneratedOption.None)]
 public Int64 PolicyID { get; set; }
Run Code Online (Sandbox Code Playgroud)

然后它会工作.

  • 我不同意这是一个丑陋的解决方案.这个IMO比上面好多了.注释真的有助于使事情可读! (6认同)
  • 您也可以在地图中执行此操作:`this.Property(t => t.id).HasColumnName("id").HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);` (3认同)

djd*_*d87 29

你有没有尝试明确指定StoreGeneratedPattern

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

builder.Entity<BOB>().MapSingleType().ToTable("BOB");
Run Code Online (Sandbox Code Playgroud)

  • 这里有与CTP 5相同的问题语法:modelBuilder.Entity <BOB>().HasKey(p => p.Id).Property(p => p.Id).HasDatabaseGenerationOption(DatabaseGenerationOption.None); modelBuilder.Entity <BOB>()ToTable( "BOB"); (10认同)

Lan*_*ico 28

我正在使用EF 4.1,Model First并遇到了这个问题.这是我解决它的方式:

使用"模型设计器"表面时,在创建实体时,必须定义"键"属性,默认为Id,int32.

在我的情况下,我选择使用Guids作为Id,所以我将int32切换为Guid.但是如果你在创建实体后检查这个Id,我看到Id的'StoreGeneratedPattern'选择了'identity'.起初我不认为这是一个问题,但是当我检查用于插入数据库的SQL时,它有点奇怪,因为它没有发送我的Id. 令人沮丧!

但是一旦我回去并将'StoreGeneratedPattern'从'identity'更改为'none',重新生成数据库并重建项目,这个奇怪的{"无法将值NULL插入列'Id',表'TestDB.dbo.BOB ';列不允许空值.INSERT失败.\ r \n语句已终止."}停止发生.

仅供参考 - 在查看sql之后,如果您为'StoreGeneratedPattern'选择了'identity',EF会将对象保存到db(无ID),然后立即取回标识并将其保存回您的对象.即'StoreGeneratedPattern'的这个选择依赖于db生成你的Id,而不是你的代码!


小智 6

你也可以使用

modelBuilder.Entity<BOB>()
    .HasKey(p => p.Id)
    .Property(p => p.Id)
    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

builder.Entity<BOB>().MapSingleType().ToTable("BOB");
Run Code Online (Sandbox Code Playgroud)