代码优先 - 无法将值NULL插入列'Id'

Arn*_*nab 28 ef-code-first entity-framework-4.1

这是我的代码,非常简单......

 var newUser = new User();
        newUser.Id=id;
        newUser.Email = email;
       this.DataContext.Set<User>().Add(newUser);
        this.DataContext.SaveChanges();
Run Code Online (Sandbox Code Playgroud)

我得到的错误是一个sqlexception,this.DataContext.SaveChanges();说明:

无法将值NULL插入列'Id',表'xxxxx.dbo.Users'; 列不允许空值.INSERT失败.

我已经调试过,发现在newUser的Id和Email中有值 this.DataContext.Set<User>().Add(newUser);

如果是这种情况,该值如何变为空?

错误堆栈跟踪:

[DbUpdateException: An error occurred while updating the entries. See the inner exception for details.]
   System.Data.Entity.Internal.InternalContext.SaveChanges() +204
   System.Data.Entity.Internal.LazyInternalContext.SaveChanges() +23
   System.Data.Entity.DbContext.SaveChanges() +20
Run Code Online (Sandbox Code Playgroud)

我无法理解或解决这个问题....

真诚地感谢任何帮助......

关心阿纳布

好的,感谢Ladislav指出我正确的方向:添加属性[DatabaseGenerated(DatabaseGeneratedOption.None)]解决了问题.

小智 24

参考这篇文章,似乎默认情况下实体框架会插入到标识列中.

要解决这个问题:

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)

或者在POCO中装饰你的钥匙:

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


bad*_*key 7

我遇到了同样的问题,发现了你的问题,然后注意到这个Entity Framework 4.1代码优先KeyAttribute是非标识列问题(它有一个解决了我的问题的属性).

如果您将User定义为:

public class User
{
    [DataMember, Required, Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
    public long ID { get; set; }

    [DataMember]
    public string Email { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这里的关键是放置属性:

  • DatabaseGenerated

到ID列.显然,我们正在努力解决的问题是,Entity Framework默认情况下会使用键作为标识进行插入.