我有一个包含子实体集合的复杂图。父子实体之间的关系是一对多关系并且具有独立关联。我知道如果没有我想避免的手动同步,我就无法保留我的图表。我发现GraphDiff解决方案很有前景,我开始探索它,但由于我的场景有些特殊,我无法实现我的目标。这个问题完全与 GraphDiff 有关,但我也欢迎其他解决方案。
public class person
{
public virtual int Id {get; set;} //primary key
public virtual string Name {get; set;}
public virtual ICollection<Car> Cars {get; set;}
}
public class Car
{
public virtual int PersonId {get; set;} // is a foreign key
public virtual Datetime BoughtDate {get; set;} // this property and above mentioned foreign key together makes a primary key in database
public virtual DateTime InsuraceStartDate {get; set;}
public virtual DateTime InsuraceExpiryDate {get; set;}
public virtual DateTime LastServiceDate {get; set;}
}
在任何给定时间,我的 Person.Cars 集合可能有 1. 一个新的汽车对象。2. 具有更新值的现有汽车对象。(保险或服务日期)。
Person 上的 Id 属性和 Car 上的 PersonId 属性将为 0。
Person _person = GetPersonToAddOrUpDate();
int id = _person.id; //id will be 0.
在这一点上,我们不确定我们收到的对象是否必须添加或更新。子实体(汽车)上的 PersonId 也将为 0。现在,如果我们调用。
Context.UpdateGraph(_person, m => m.OwnedCollection(x => x.Cars));
throws exception at FindEntityMatching(entity).
为了克服这个问题,我必须更新人的 Id 属性。
var dbPersonId = Context.Single<Person>(x => x.Name == _person.Name).Id;
_person.id = dbPersonId != null ? dbPersonId : 0;
Context.UpdateGraph(_person, m => m.OwnedCollection(x => x.Cars));
它删除 dbPerson.Cars 中的所有实体并将 _person.Cars 添加到 dbPerson.Cars 并保存。这意味着数据库中我的 Cars 表中的所有记录都将被删除,并插入 _person.Cars 中的记录。我注意到这种情况正在发生,因为现在子实体没有 Id 属性。我必须手动设置它们。
foreach(var car in _person.Cars)
car.PersonId = _person.Id
现在如果你打电话
Context.UpdateGraph(_person, m => m.OwnedCollection(x => x.Cars));
这将从持久对象中缺少的瞬态对象添加集合中的实体,并更新持久对象中匹配的对象,并从持久对象中删除其余实体。
var dbCars = conext.Where(x => x.Personid == _person.Id).Select(x).ToList();
说 dbCars.Count 是 8 并且 _person.Cars.Count 是 3。(一辆新车和两辆更新值的旧车)一旦你跑了。
Context.UpdateGraph(_person, m => m.OwnedCollection(x => x.Cars));
dbCars 中匹配的 _person.Cars 中的 2 辆旧车将被更新。将添加 1 辆来自 _person.Cars 的新车在 dbCars 中不匹配。
现在 dbCars 的计数必须为 9,因为我们添加了一辆新车。现在检查计数。
var dbCarCount = conext.Where(x => x.Personid == _person.Id).Select(x).ToList().Count();
dbCarCount 将是 3。dbCars 中剩下的 6 辆汽车正在被移除。
我希望我错了,因为我喜欢使用您的解决方案。我在这方面的工作停滞不前。如果我遗漏了什么或者您需要更多信息,请告诉我。我知道我的文章令人困惑,因为我试图将我所有的测试经验都放在 GraphDiff 上。希望你解决这个问题。