2009-04-23 19 views
8

Buduję aplikację WPF przy użyciu wzorca MVVM. Nasz stos wygląda tak:Entity Framework + POCO

SQL Server 2008 -> Entity Framework

Używamy StructureMap do wstrzykiwania zależności wstrzykiwać naszą DataFactory który zasadniczo robi to CRUD dla naszych obiektów biznesowych poco.

ViewModels używa DataFactory dla CRUD, a xaml to dane powiązane z właściwościami w POCO.

Wszystko działa świetnie, ale jedyną rzeczą, którą uważam za nieco irytującą, jest fabryka danych. Kopiujemy każdą właściwość z Obiektu EF do POCO na wybranej i odwrotnie przy aktualizacji/wstawianiu.

Czy istnieje sposób automatyzacji tego procesu, tak jak Fluent robi dla NHibernate, ale z Entity Framework?

Oto metoda wkładka próbki w fabryce danych:

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

Byłoby miło zadeklarować jakąś klasę, jak Fluent robi:

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

Wreszcie moja metoda wkładka będzie wyglądać to:

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

Zasadniczo wyeliminowałbym kod do przenoszenia danych z firmy obj ect do obiektu pracy frame encji byłaby wykonana raz w klasie mapowania i nie musiałaby być powtarzana dla każdej metody.

Dzięki!

+0

Kod trochę proszę? – chakrit

Odpowiedz

1

Chociaż nie jestem świadomy programu odwzorowującego dane, który robi to, co chcesz dla EF, nie jest trudno go napisać. Ponieważ zdefiniowanie odwzorowań jest w większości pracy, nie jest to wcale trudniejsze niż użycie wymienianych mapowań interfejsu. Po prostu tworzysz klasę Mapper, która ma wiele funkcji map, z których każda zawiera logikę mapowania.

Jedną z myśli, która może być interesująca, jest opracowanie metod rozszerzenia funkcji mapy. Nadal będzie utworzyć klasę Mapper, ale każda z metod map będzie wyglądać

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

Ponieważ metoda MapToPerson jest metoda rozszerzenie, a nie naprawdę metoda na swojej klasie bizObject, nie łamiesz poco . Jednak, ze względu na cukier składniowej metody wydłużania, metoda InsertCustomer może mieć kod jak poniżej:

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