2014-07-23 63 views
0

当添加或更新一行时,EF(v5.0)不会将值指定给可为null的int(int?)字段。实体框架不分配int?字段

这里是我的代码一个简化版本:

public class MyTable 
{ 
    public int Id { get; set; } 
    public Nullable<int> MyInt { get; set; } 
} 


void UpdateRow(MyTable currentRow) 
{ 
    MyTable rowToUpdate = transaction.entity.Find(currentRow.Id); 

    rowToUpdate.MyInt = currentRow.MyInt; 

    transaction.Context.SaveChanges(); 
} 

的SaveChanges工作得很好(返回1,也不例外),但不更新敏。我已经确认这两个MyTable对象都包含所需的值。

这发生在添加和更新。请注意,我有可以添加/更新的其他类型的可空字段(例如DateTime?)。

+1

你的假设EF不会更新int?的错误。只要尝试用正常的int替换MyInt属性,我敢打赌那也不会被更新。看起来你已经对交易对象做了一些漂亮的事情。问题的根源可能在于那个阶级。 – Dabblernl

+0

我有可能将手指指向错误的罪魁祸首(EF)。大多数底层代码(例如事务对象)都是从模板生成的,因此一种可空字段的代码与其他任何类型的代码大致相同。请回想一下,我对其他类型的可空字段(例如DateTime)没有问题。我将查看生成的代码(不是我的)。 我指向EF的原因是我读了一篇关于这个确切问题的晦涩的帖子,有人说它会在下一个版本中修复。但是,我无法确认问题或解决方法。 – DaveK

回答

0

这里是我的解决方案在我的数据库更新的entites:

var person = unitOfWork.PersonRepository.GetByID(1); 
person.FirstName = "NewName"; 
unitOfWork.PersonRepository.Update(person); 
unitOfWork.Save(); 

public virtual void Update(TEntity entityToUpdate) 
     { 
      DBSet.Attach(entityToUpdate); 
      Context.Entry(entityToUpdate).State = EntityState.Modified; 
     } 

保存()仅调用的SaveChanges()。

你需要附上你的实体,在你的代码中你只是编辑局部变量!

希望这会有所帮助!

+0

我使用相同的基本策略来添加/更新其他表,它工作得很好。该问题对于可空int字段非常具体。请注意,该策略适用于具有非空字段和其他类型的可为空字段的表(例如DateTime)。 – DaveK