2

コレクションの子エンティティを含む複雑なグラフがあります。親エンティティと子エンティティの関係は 1 対多の関係であり、独立した関連付けがあります。避けたい手動同期なしではグラフを永続化できないことはわかっています。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.Now になります。

     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 であるとします (値が更新された新しい車 1 台と古い車 2 台)。

    Context.UpdateGraph(_person, m => m.OwnedCollection(x => x.Cars));

dbCars で一致する _person.Cars の 2 つの古い車が更新されます。dbCars で一致しない _person.Cars から 1 台の新しい車が追加されます。

新しい車を追加したので、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 に答える