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)
我遇到了同样的问题,发现了你的问题,然后注意到这个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)
这里的关键是放置属性:
到ID列.显然,我们正在努力解决的问题是,Entity Framework默认情况下会使用键作为标识进行插入.
| 归档时间: |
|
| 查看次数: |
21742 次 |
| 最近记录: |