这是我的代码,非常简单......
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)]
解决了问题。
答案 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; }
}
这里的关键是放置属性:
到ID列上。显然,我们正在努力解决的问题是,默认情况下,实体框架希望插入密钥为标识。
答案 2 :(得分:2)
我通过将列属性的StoreGeneratedPattern
设置为Computed
来解决此问题。
下面一步一步:
StoreGeneratedPattern
更改为Computed
。
希望能帮助某人。