2017-12-01 7 views
0

私はクラスUserを持っています。 UserOneとUserTwoはユーザーです。 UserTwoのすべての外部キー関係をUserOneに転送する必要があります。エンティティコア内のすべての外部キーのナビゲーションを更新します。

私はやって手動でこれを行うことができます:

userTwo.PostsCreatedByUser.ToList().ForEach(a => a.CreatedByUserId = userOne.Id); 
userTwo.NotesCreatedByUser.ToList().ForEach(a => a.CreatedByUserId = userOne.Id); 
context.SaveChanges(); 

をしかし、この動的を行う方法があった場合、私は不思議でしたか? 上記の方法で、CreatedByUserId列を持つ新しいテーブルを追加する場合、この手順に戻り、新しいコレクションで更新する必要があります。ここで

は、例えば、クラスの概要である:

public partial class User 
{ 
    public User() 
    { 
     PostsCreatedByUser = new HashSet<Post>(); 
     NotesCreatedByUser = new HashSet<Note>(); 
    } 

    public virtual ICollection<Posts> PostsCreatedByUser { get; set; } 
    public virtual ICollection<Notes> NotesCreatedByUser { get; set; } 
} 

public partial class Post 
{ 
    public Post() { } 

    public int CreatedByUserId { get; set; } 

    public virtual User CreatedByUser { get; set; } 
} 

public partial class Note 
{ 
    public Note() { } 

    public int CreatedByUserId { get; set; } 

    public virtual User CreatedByUser { get; set; } 
} 
+0

あなたの唯一の他の選択肢は、反映されているようです。 – gldraphael

答えて

0

あなたは、反射アクションを使用することができますか、それはあなたのニーズをsatisfys場合、あなたはこのようなUserエンティティの拡張メソッドを作成することができます。

public static class UserEntityExtensions 
{ 
    public static void ConvertRelatedEntities(this User userTwo, User userOne) 
    { 
     userTwo.PostsCreatedByUser.ToList().ForEach(a => a.CreatedByUserId = userOne.Id); 
     userTwo.NotesCreatedByUser.ToList().ForEach(a => a.CreatedByUserId = userOne.Id); 
    } 
} 

使用

userTwo.ConvertRelatedEntities(userOne); 

あなたが更新されます別のコレクションを追加する必要がある場合は、拡張メソッドにそれを置くことができます。より簡単に管理できます。

+0

これは本当に利点がありますか?新しいコレクションのコードを調整する必要があります。それ以外にも、私はむしろドメインエンティティ内に保持するドメインロジックをアウトソースします。これにより、強力なカプセル化を維持しやすくなります。 – mbnx

+0

はい、開発者は必要に応じて新しいコレクションを追加する必要があります。また、「アウトソーシング・ドメイン・ロジック」とは、わかりませんでした。ちなみに、私は変換のプロセスをより簡単に維持する必要があると思います。開発者は、変換プロセスを実行するすべてのコード行を変更する必要がないためです。 ConvertRelatedEntitiesメソッドを変更するだけで十分です。 – lucky

+0

この厳密なケースでは、ドメインロジックをいくつかの拡張クラスに入れても害はありません。しかし、プライベートメンバーや保護されたメンバーにアクセスすることはできません。割り当てが完了するたびに、保護されたタイムスタンプをユーザーエンティティ内で更新する必要がある場合はどうなりますか?エンティティが再割り当てされた各コレクションに対してドメインイベントを発行する必要がある場合はどうなりますか?割り当てとイベントの作成は、1つのアトミックなステップでなければなりません。拡張を使用すると、これを破るか、イベント集約コンポーネントを渡す必要があります。 – mbnx

関連する問題