2009-04-23 9 views
8

Je construis une application WPF en utilisant le modèle MVVM. Notre pile ressemble à ceci:Entity Framework + POCO

SQL Server 2008 -> Entity Framework

Nous utilisons StructureMap pour l'injection de dépendance à injecter notre DataFactory qui fait essentiellement la CRUD pour nos objets métier POCO.

Les ViewModels utilisent la DataFactory pour CRUD et le xaml est lié aux propriétés des POCO.

Le tout fonctionne très bien, mais la seule chose que je trouve être un peu ennuyeux est dans la fabrique de données. Nous copions chaque propriété de l'objet EF sur le POCO un sur select et l'inverse sur la mise à jour/insertion.

Est-il possible d'automatiser ce processus comme le fait Fluent pour NHibernate mais avec Entity Framework?

Voici une méthode d'insertion d'échantillon dans l'usine de données:

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

Ce serait bien de déclarer une classe, comme Fluent le fait:

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

Enfin ma méthode d'insertion ressemblerait ceci:

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

Essentiellement je éliminerais le code pour déplacer des données de l'obj affaires ect à l'objet de travail de trame d'entité, il serait effectué une fois dans la classe de mappage et n'aurait pas besoin d'être répété pour chaque méthode.

Merci!

+0

Du code, s'il vous plaît? – chakrit

Répondre

1

Bien que je ne sois pas au courant d'un mappeur de données qui fait ce que vous voulez pour EF, il n'est pas difficile d'en écrire un. Aussi, puisque la définition des mappings est la plus grande partie du travail, ce n'est vraiment pas plus difficile que d'utiliser les mappages d'interface courants que vous avez listés. Vous venez de créer une classe Mapper dotée de plusieurs fonctions de carte, chacune contenant votre logique de mappage. Une idée qui pourrait être intéressante est de faire de vos fonctions de carte des méthodes d'extension de l'extension. Vous toujours créer une classe Mapper, mais chacune des méthodes de carte ressemblerait

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

Puisque la méthode MapToPerson est une méthode d'extension, et pas vraiment une méthode sur votre classe bizObject, vous n'êtes pas briser le POCO . Mais, à cause du sucre syntaxique de la méthode d'extension, votre méthode de InsertCustomer pourrait avoir un code comme ceci:

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