2009-04-23 16 views
8

Ich baue eine WPF-Anwendung mit dem MVVM-Muster. Unser Stapel sieht wie folgt aus:Entity Framework + POCO

SQL Server 2008 -> Entity Framework

Wir verwenden StructureMap für Dependency Injection unsere Datafactory zu injizieren, die im Wesentlichen funktioniert die CRUD für unsere POCO-Business-Objekten.

Die ViewModels verwenden die DataFactory für CRUD und die XAML sind Daten, die an die Eigenschaften in den POCOs gebunden sind.

Die ganze Sache funktioniert gut, aber das einzige, was ich etwas ärgerlich finde, ist in der Datenfabrik. Wir kopieren jede Eigenschaft aus dem EF-Objekt in die POCO-Datei bei Auswahl und umgekehrt bei Aktualisierung/Einfügung.

Gibt es eine Möglichkeit, diesen Prozess zu automatisieren, wie es Fluent für NHibernate tut, aber mit dem Entity Framework?

Hier ist ein Beispiel insert-Methode in der Daten Fabrik ist:

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

Es wäre schön, etwas Klasse zu erklären, wie Fluent es tut:

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

meine insert-Methode würde schließlich aussehen dies:

Im Wesentlichen würde ich den Code zum Verschieben von Daten aus dem Geschäft Obj beseitigen Dies würde einmal in der Mapping-Klasse geschehen und müsste nicht für jede Methode wiederholt werden.

Danke!

+0

Einige Code bitte? – chakrit

Antwort

1

Obwohl mir nicht bekannt ist, dass ein Datenmapper für EF funktioniert, ist es nicht schwer, einen zu schreiben. Auch, seit das Definieren der Zuordnungen die meiste Arbeit ist, ist es wirklich nicht schwieriger, als die fließenden Schnittstellenzuordnungen zu verwenden, die Sie aufgelistet haben. Sie erstellen lediglich eine Mapper-Klasse mit mehreren Kartenfunktionen, von denen jede Ihre Zuordnungslogik enthält.

Ein Gedanke, der interessant sein könnte, ist, Ihre Kartenfunktionen Erweiterungsmethoden zu machen. Sie würden immer noch eine Mapper-Klasse erstellen, aber jeder der Karten Methoden wie

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

aussehen würde Da die MapToPerson Verfahren eine Erweiterung Methode ist, und nicht wirklich eine Methode auf Ihrer bizObject Klasse, sie ist nicht die POCO brechen . Aber wegen des syntaktischen Zuckers des Erweiterungsmethode, könnte Ihre Insert Methode Code wie diese:

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