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

时间:2011-10-22 07:42:02

标签: entity-framework-4.1 ef-code-first

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

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

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

  

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

我已经调试过并发现Id&amp;在newUser发送电子邮件至 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

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

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

此致 ARNAB

解决方案

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

3 个答案:

答案 0 :(得分:23)

参考this post,似乎实体框架默认情况下会插入到标识列中。

要解决这个问题,请尝试:

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

builder.Entity<BOB>().MapSingleType().ToTable("BOB");

或在POCO中装饰您的密钥:

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

答案 1 :(得分:7)

我遇到了同样的问题,发现了你的问题,然后发现了这个Entity Framework 4.1 code-first KeyAttribute as non-identity column问题(其中有一个属性解决了我的问题)。

如果您将User定义为:

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

    [DataMember]
    public string Email { get; set; }
}

这里的关键是放置属性:

  • Key
  • DatabaseGenerated

到ID列上。显然,我们正在努力解决的问题是,默认情况下,实体框架希望插入密钥为标识。

答案 2 :(得分:2)

我通过将列属性的StoreGeneratedPattern设置为Computed来解决此问题。

下面一步一步:

  1. 打开您的EDMX(在Visual Studio中双击)
  2. 右键单击导致问题的列,选择属性。
  3. StoreGeneratedPattern更改为Computed
  4. From the IDE enter image description here

    希望能帮助某人。