2009-04-23 22 views
8

Sto costruendo un'applicazione WPF utilizzando il pattern MVVM. Il nostro stack di simile a questa:Entity Framework + POCO

SQL Server 2008 -> Entity Framework

Usiamo StructureMap per l'iniezione di dipendenza per iniettare il nostro DataFactory che fa essenzialmente la CRUD per i nostri oggetti di business POCO.

I ViewModels utilizzano DataFactory per CRUD e xaml è associato ai dati delle proprietà nei POCO.

Il tutto funziona alla grande ma l'unica cosa che trovo un po 'fastidiosa è nella fabbrica di dati. Copiamo ogni proprietà dall'oggetto EF a quella POCO su select e al contrario su update/insert.

C'è un modo per automatizzare questo processo come fa Fluent per NHibernate ma con Entity Framework?

Ecco un metodo di inserimento del campione in fabbrica dei dati:

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(); 
} 

sarebbe bello per dichiarare una classe, come Fluent fa:

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); 
    } 
} 

Finalmente il mio metodo di inserimento sarà simile this:

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(); 
} 

Essenzialmente eliminerei il codice per spostare i dati dal business obj ect all'oggetto frame work dell'entità sarebbe eseguito una volta nella classe di mapping e non dovrebbe essere ripetuto per ciascun metodo.

Grazie!

+0

Alcuni codice per favore? – chakrit

risposta

1

Anche se non sono a conoscenza di un mapper dei dati che fa ciò che si desidera per EF, non è difficile scriverne uno. Inoltre dal momento che la definizione delle mappature è la maggior parte del lavoro, in realtà non è più difficile rispetto all'utilizzo dei mappaggi delle interfacce fluenti che hai elencato. Devi solo creare una classe Mapper che abbia più funzioni di mappa, ognuna delle quali contiene la tua logica di mappatura.

Un pensiero che potrebbe essere interessante è rendere i metodi di estensione delle funzioni della mappa. Si potrebbe ancora creare una classe Mapper, ma ciascuno dei metodi della mappa sarebbe simile

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

Poiché il metodo MapToPerson è un metodo di estensione, e non è davvero un metodo sulla tua classe bizObject, non stai rompendo il POCO . Ma, a causa dello zucchero sintattico del metodo di estensione, il metodo di InsertCustomer potrebbe avere codice come questo:

Customer customer = bizObject.MapToCustomer(); 
    Person person = bizObject.MapToPerson(); 
Problemi correlati