2009-04-23 13 views
8

Estoy construyendo una aplicación WPF usando el patrón MVVM. Nuestra pila se ve así:Entity Framework + POCO

SQL Server 2008 -> Marco de la entidad

Utilizamos StructureMap para la inyección de dependencias para inyectar nuestra DataFactory que esencialmente hace el CRUD para nuestros objetos de negocio POCO.

Los ViewModels usan DataFactory para CRUD y xaml son datos vinculados a las propiedades en POCO.

Todo funciona bien, pero lo único que me resulta un poco molesto es en la fábrica de datos. Copiamos cada propiedad desde el objeto EF hasta el POCO en seleccionar y viceversa en la actualización/inserción.

¿Hay alguna manera de automatizar este proceso como lo hace Fluent para NHibernate pero con Entity Framework?

Aquí es un método de muestreo de inserción en la fábrica de datos:

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

que sería bueno para declarar una clase, como Fluido lo hace:

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 mi método de inserción se vería esto:

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

Esencialmente eliminaría el código para mover datos del obj de negocios Con el objeto de trabajo de marco de entidad se realizaría una vez en la clase de mapeo y no tendría que repetirse para cada método.

Gracias!

+0

algún código por favor? – chakrit

Respuesta

1

Aunque no conozco un asignador de datos que haga lo que desea para EF, no es difícil escribir uno. Además, como la mayor parte del trabajo es definir las asignaciones, en realidad no es más difícil que utilizar las asignaciones de interfaz fluidas que mencionaste. Usted acaba de crear una clase Mapper que tiene múltiples funciones de mapa, cada una de las cuales contiene su lógica de mapeo.

Un pensamiento que podría ser interesante es hacer que los métodos de extensión de las funciones del mapa. A pesar de ello crear una clase Mapper, pero cada uno de los métodos mapa se vería

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

Dado que el método MapToPerson es un método de extensión, y no es realmente un método en su clase bizObject, no se está rompiendo la POCO . Pero, debido a que el azúcar sintáctica del método de extensión, su método de InsertCustomer podría tener un código como éste:

Customer customer = bizObject.MapToCustomer(); 
    Person person = bizObject.MapToPerson(); 
Cuestiones relacionadas