2012-02-21 13 views
2

親エンティティから別の親エンティティに子エンティティを移動する最善の方法は何ですか? ObjectContextまたはDbContextの中に、これを実現するメソッドがありますか?子エンティティを新しい親エンティティに移動

public class Person 
{ 
    public int PersonId 
    public ICollection<Car> Cars 
} 

public class Car 
{ 
    public int CarId 
    public string Color 
} 

編集:私は現在、POCOテンプレートで最初にEF 4.0モデルを使用しています。

+0

あなたはEF(例えば、コードまず、最初のスキーマなど)...あなたはPOCOを使用している、プロキシなどなどを使用してどのように依存テンプレートで生成されたエンティティまたはプロキシを使用している場合は、メモリ内の関係を変更して保存するだけで済みます。 –

+0

@JamesGaunt:ありがとうジェームズ、私は私の質問を編集しました。 – madatanic

+0

コレクションから削除して別のコレクションに追加しようとしましたか? – usr

答えて

2

この例では車の所有者をに変更しています。

public class Car 
{ 
    ... 
    public virtual Person Owner { get; protected set; } 

    public void ChangeOwner(Person newOwner) 
    { 
      // perform validation and then 
      Owner = newOwner; 
      // maybe perform some further domain-specific logic 
    } 
} 

注:CarPersonに戻って参照を追加することに対する重大な短所が存在しない場合、私のようなものでいいと思う保護セッター外部の消費者がChangeOwnerメソッドを呼び出して強制することです。 EFでは、POCOクラスの自動生成されたプロキシのおかげで、適切に設定できるようになります(使用すると仮定します)。

EDIT: Personに後方参照を追加する可能性がない場合でも、ドメインロジックの観点から見ても同じ目標があります。あなたは車の所有者を変更したいだけです。

public void ChangeCarOwner(Person originalOwner, Person newOwner, int carId) 
{ 
    Car car = originalOwner.RemoveCarOwnership(carId); 
    newOwner.AddCarOwnership(car); 
} 

public class Person 
{ 
    ... 
    public Car RemoveCarOwnership(int carId) 
    { 
     Car car = this.Cars.Single(c => c.Id == carId); 
     this.Cars.Remove(car); 
     return car; 
    } 
} 

これは単に概念的なコードの一部とある:私はおそらく(かかわらず、それがうまく設計されたシステムに置かれるべき場所の)実体の外のどこかに置い方法で行くと思いますので、このような動作は、2 entitesが関与しますそれは最も確かに書くことができます(古い所有者が実際に車を所有していることを確認してください)が、私はちょうど私がそれにどのようにアプローチするかのアイデアを提示したかったのです。私もAddCarOwnershipの実装をommited私はそれがかなり緊迫していると思う原因。私は、所有権の追加と削除が、特定の人の「内部」のさらなる論理を引き起こす原因となるこれらの方法を導入しました。非常に多くの

+0

車にナビゲーションプロパティがない場合所有者、どのようにこれにアプローチしますか? – madatanic

+0

私の編集をチェックしてください。 – dmusial

+0

だから、基本的に、あなたは一人の人から "車"を取り除いて、その人の車を別の人に加えます。それが私のやり方です。 – madatanic

関連する問題