考虑下面的代码片段:
public partial class DatabaseContext : DbContext
{
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
Contract.Assume(modelBuilder != null);
modelBuilder.Entity<User>()
.HasOptional(x => x.Profile).WithRequired(x => x.User);
base.OnModelCreating(modelBuilder);
}
}
在第8行(.HasOptional,.WithRequired)代码契约分析工具生成以下两个警告:"CodeContracts:可能调用空引用上的方法“
有没有什么办法来处理它呢?
发布于 2011-04-19 12:41:57
一个选项是用ContractVerification(false)属性标记整个方法:
public partial class DatabaseContext : DbContext
{
[ContractVerification(false)]
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<User>()
.HasOptional(x => x.Profile).WithRequired(x => x.User);
base.OnModelCreating(modelBuilder);
}
}
的另一个是添加几十个Contract.Assume()检查:
public partial class DatabaseContext : DbContext
{
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
Contract.Assume(modelBuilder != null);
var userEntity = modelBuilder.Entity<User>();
Contracts.Assume(userEntity != null);
var profileEntity = userEntity.HasOptional(x => x.Profile);
Contracts.Assume(profileEntity != null);
profileEntity.WithRequired(x => x.User);
base.OnModelCreating(modelBuilder);
}
}
我们还有其他选择吗?你喜欢哪一种?
发布于 2011-04-19 11:33:31
我不知道EF,但我相信你不能直接调整.Entity<User>()
函数?此函数不指定它返回非空值的约定。尝试执行以下操作:
var userEntity = modelBuilder.Entity<User>();
Contract.Assert( userEntity != null );
附言:我找到了这个链接,你可能会感兴趣,discussing Code Contracts and Entity Framework。
https://stackoverflow.com/questions/5715456
复制相似问题