我首先在Web项目中使用EF 5.0,DB。
对于我们的服务层,我们将Agatha与AutoMapper一起使用,因此所有数据都作为POCO对象到达服务层。
我有一个如下所示的数据结构:
public class FirstClass
{
public int Id { get; set; }
public int? SelectedSecondClassId { get; set; }
public SecondClass SelectedSecondClass { get; set; }
public ICollection<SecondClass> MySecondClasses { get; set; }
//other properties go here
}
public class SecondClass
{
public int Id { get; set; }
public int ParentSecondClassId { get; set }
public SecondClass ParentSecondClass { get; set; }
//other properties go here
}
现在假设我尝试更新FirstClass对象并在1中执行以下操作:
然后EF拒绝打球。我无法让它发挥作用。如果我查看changetracker,我会看到实体上的SelectedSecondClass再次为空,但是SelectedSecondClassId设置为0.这是他无法解决的问题,因为在正确创建之前有2个Id 0对象
如果我这样做,我可以解决问题:
var newId = -1;
foreach (var newSecondClass in firstClass.MySecondClasses.Where(x => x.Id <= 0))
{
newSecondClass.Id = newId;
newId --;
}
if (firstClass.SelectedSecondClass != null)
{
firstClass.SelectedSecondClassId = firstClass.SelectedSecondClass.Id;
}
// Send the updates to EF
根据您的理解,我觉得这有点被黑客攻击,而另一位开发人员很容易忘记这样的事情。我想有一个更好的方法来做到这一点。最好以我在DbContext包装器中的SaveChanges()之前“修复”这种情况的方式。
有人能指出我正确的方向吗?