2009-04-23 23 views
8

MVVMパターンを使用してWPFアプリケーションを構築しています。 - > Entity FrameworkのEntity Framework + POCO

私たちは、基本的に私たちのPOCOのビジネス・オブジェクトのCRUD処理を行い、当社のDataFactoryを注入する依存性の注入のためのStructureMapを使用

SQL Server 2008の:私たちのスタックは、次のようになります。

ViewModelsはCRUDにDataFactoryを使用し、xamlはPOCOのプロパティにバインドされたデータです。

すべてがうまく動作しますが、迷惑になることがわかったのはデータファクトリーだけです。 EFオブジェクトの各プロパティを選択時にPOCOに、更新/挿入時に逆にコピーします。

NHibernateではなくEntity FrameworkでFluentがこのようなプロセスを自動化する方法はありますか?ここで

は、データの工場でのサンプルinsertメソッドです:

public void InsertCustomer(ref Manager.Model.Customer businessObject) 
{ 
    var mgr = new Manager.Data.PersonData.PersonContext(); 

    var person = new Manager.Data.PersonData.Person(); 
    var customer = new Manager.Data.PersonData.Customer(); 

    customer.Comments = businessObject.Comments; 
    customer.Company = businessObject.Company; 
    customer.IsBusiness = businessObject.IsBusiness; 
    customer.IsCompleted = businessObject.IsCompleted; 
    customer.ModifiedBy = "someone"; 
    customer.ModifiedOn = DateTime.Now; 
    customer.CreatedBy = "someone"; 
    customer.CreatedOn = DateTime.Now; 

    person.Customer.Add(customer); 
    person.FirstName = businessObject.FirstName; 
    person.LastName = businessObject.LastName; 
    person.Birthday = businessObject.Birthday; 
    person.CreatedBy = "someone"; 
    person.CreatedOn = DateTime.Now; 
    person.Gender = businessObject.Gender; 
    person.MiddleInitial = businessObject.MiddleInitial; 
    person.ModifiedBy = "someone"; 
    person.ModifiedOn = DateTime.Now; 
    person.Nickname = businessObject.Nickname; 
    person.Picture = ""; 
    person.Suffix = businessObject.Suffix; 
    person.Title = businessObject.Title; 

    mgr.AddToPeople(person); 
    mgr.SaveChanges(); 
} 

流暢にそれをしないように、いくつかのクラスを宣言するとよいでしょう:

public class CatMap : ClassMap<Cat> 
{ 
    public CatMap() 
    { 
    Id(x => x.Id); 
    Map(x => x.Name) 
     .WithLengthOf(16) 
     .Not.Nullable(); 
    Map(x => x.Sex); 
    References(x => x.Mate); 
    HasMany(x => x.Kittens); 
    } 
} 

最後に私のinsertメソッドは次のようになりますこれは:

public void InsertCustomer(ref Manager.Model.Customer businessObject) 
{ 
    var mgr = new Manager.Data.PersonData.PersonContext(); 

    var person = new Manager.Data.PersonData.Person(); 
    var customer = new Manager.Data.PersonData.Customer(); 

    Something.Map(person, businessObject); 
    Something.Map(customer, businessObject); 

    person.Customer.Add(customer); 

    mgr.AddToPeople(newCustomer); 
    mgr.SaveChanges(); 
} 

本質的に私はビジネスobjからデータを移動するコードを削除しますエンティティフレームワークオブジェクトに対しては、マッピングクラスで一度実行され、各メソッドに対して繰り返される必要はありません。

ありがとうございます!

+0

いくつかのコードを入力してください。 – chakrit

答えて

1

私はあなたがEFのためにしたいことをするデータマッパーを認識していませんが、それを書くのは難しくありません。また、マッピングの定義はほとんどの作業であり、あなたがリストアップした流暢なインターフェイスマッピングを使用するよりも、それほど難しいことではありません。マップロジックを含む複数のマップ関数を持つMapperクラスを作成するだけです。

面白いかもしれない1つの考えは、マップ関数の拡張メソッドを作ることです。あなたはまだマッパークラスを作成しますが、MapToPerson方法が本当に、あなたはPOCOを壊していない、あなたのbizObjectクラスのメソッド拡張メソッドではなく、ので、マップの各メソッドは、

public static Person MapToPerson(this Manager.Model.Customer bizObject) 
    { 
     Person person = new Person(); 
     // mapping logic 
     return person; 
    } 

ようになります。 。しかし、理由は拡張メソッドのシンタックスシュガーで、あなたのInsertCustomer方法は、このようなコードを持つことができます:

Customer customer = bizObject.MapToCustomer(); 
    Person person = bizObject.MapToPerson(); 
関連する問題