具有断开连接的子实体的断开复杂图

时间:2013-11-15 20:22:22

标签: entity-framework-6 graphdiff

我有一个带有集合子实体的复杂图。父实体和子实体之间的关系是一对多关系,并且具有独立关联。我知道我不能保留我的图表而没有手动同步,我想避免。我发现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.具有更新值的现有汽车对象(保险或服务日期)。

Car上Person和PersonId的Id属性为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));

将更新来自_person.Cars在dbCars中匹配的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上。希望你能解决这个问题。

2 个答案:

答案 0 :(得分:2)

如果您有一个断开连接的图表,并且想要将其合并到数据库,那么它应该做三件事:

  1. 插入新实体
  2. 更新现有实体
  3. 删除不在图表中的实体
  4. 您似乎遇到了最后一部分的问题。

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

答案 1 :(得分:0)

我找到了两种工具:

  1. Trackable-Entities
    • 轻量级客户端 - 服务器工具,支持缓存和存储断开连接的图形。
    • 支持PCL,Xamarin和其他平台
    • 麻省理工学院执照
  2. Breeze#
    • 完善的客户端 - 服务器设施,支持缓存和存储断开连接的图形。
    • UWP不支持
    • 维护费用非常低
    • 麻省理工学院获得许可