2009-04-23 51 views
8

Tôi đang xây dựng một ứng dụng WPF bằng cách sử dụng mẫu MVVM. chồng của chúng tôi trông như thế này:Entity Framework + POCO

SQL Server 2008 -> Entity Framework

Chúng tôi sử dụng StructureMap cho dependency injection để tiêm DataFactory của chúng tôi mà về cơ bản hiện CRUD cho các đối tượng kinh doanh POCO của chúng tôi.

Chế độ xemMô hình sử dụng DataFactory cho CRUD và xaml là dữ liệu được liên kết với các thuộc tính trong POCO.

Toàn bộ nội dung hoạt động tuyệt vời nhưng điều duy nhất tôi thấy là phần nào gây phiền toái là trong nhà máy dữ liệu. Chúng tôi sao chép từng thuộc tính từ đối tượng EF sang đối tượng POCO được chọn và ngược lại khi cập nhật/chèn.

Có cách nào để tự động hóa quá trình này như Fluent không cho NHibernate nhưng với khung thực thể?

Dưới đây là một phương pháp mẫu chèn trong nhà máy dữ liệu:

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

Nó sẽ được tốt đẹp để khai báo một số lớp, như thạo thực hiện nó:

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

Cuối cùng phương pháp chèn của tôi sẽ như thế nào này:

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

Về cơ bản tôi sẽ loại bỏ mã để di chuyển dữ liệu từ doanh nghiệp ect cho đối tượng làm việc của khung thực thể, nó sẽ được thực hiện một lần trong lớp ánh xạ và sẽ không phải lặp lại cho mỗi phương thức.

Cảm ơn!

+0

Một số mã xin vui lòng? – chakrit

Trả lời

1

Mặc dù tôi không biết một người lập bản đồ dữ liệu thực hiện những gì bạn muốn cho EF, nhưng không khó để viết một. Ngoài ra, kể từ khi xác định ánh xạ là hầu hết các công việc, nó thực sự không phải là bất kỳ khó khăn hơn bằng cách sử dụng ánh xạ giao diện thông thạo mà bạn liệt kê. Bạn chỉ cần tạo một lớp Mapper có nhiều hàm bản đồ, mỗi hàm chứa logic ánh xạ của bạn.

Một ý nghĩ có thể thú vị là tạo các phương thức mở rộng chức năng bản đồ của bạn. Bạn vẫn sẽ tạo ra một lớp Mapper, nhưng mỗi người trong số các phương pháp bản đồ sẽ trông như thế

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

Kể từ khi phương pháp MapToPerson là một phương pháp mở rộng, và không thực sự là một phương pháp trên lớp bizObject của bạn, bạn không phá vỡ POCO . Nhưng, do đường cú pháp của phương pháp mở rộng, phương thức InsertCustomer của bạn có thể có mã như sau:

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