2

我有一个包含子实体集合的复杂图。父子实体之间的关系是一对多关系并且具有独立关联。我知道如果没有我想避免的手动同步,我就无法保留我的图表。我发现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 上。希望你解决这个问题。

4

2 回答 2

2

如果你有一个断开连接的图并且你想将它合并到数据库中,那么它应该做 3 件事:

  1. 插入新实体
  2. 更新现有实体
  3. 删除不在图中的实体

您似乎对最后一部分有问题。

如果首先没有从数据库中检索到图形,那么您没有按预期使用 GraphDiff。您将不得不手动添加和更新。

于 2013-11-19T16:01:09.280 回答
0

我为此找到了两个工具:

  1. 可追踪实体
    • 支持缓存和存储断开连接图的轻量级客户端-服务器工具。
    • 支持 PCL、Xamarin 和其他平台
    • 麻省理工学院执照
  2. 微风#
    • 成熟的客户端-服务器工具,支持缓存和存储断开连接的图。
    • UWP 中不支持
    • 非常低的维护
    • 麻省理工学院许可
于 2017-07-11T23:46:36.693 回答