实体框架+ POCO

Luk*_*asz 8 structuremap entity-framework poco fluent-nhibernate

我正在使用MVVM模式构建WPF应用程序.我们的堆栈看起来像这样:

SQL Server 2008 - >实体框架

我们使用StructureMap进行依赖注入,以注入我们的DataFactory,它基本上为我们的POCO业务对象执行CRUD.

ViewModels使用DataFactory进行CRUD,xaml是绑定到POCO中属性的数据.

整件事情很有效,但我发现有点烦恼的是数据工厂.我们将每个属性从EF对象复制到选择时的POCO和更新/插入的反向.

有没有办法自动化这个过程,就像Fluent为NHibernate做的那样,但是使用Entity Framework?

以下是数据工厂中的示例插入方法:

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();
}
Run Code Online (Sandbox Code Playgroud)

声明一些类会很好,就像Fluent那样:

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);  
  }  
}
Run Code Online (Sandbox Code Playgroud)

最后我的插入方法如下所示:

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();
}
Run Code Online (Sandbox Code Playgroud)

本质上,我将消除将数据从业务对象移动到实体框架工作对象的代码,它将在映射类中完成一次,并且不必为每个方法重复.

谢谢!

mxm*_*ile 11

您可以尝试Automapper,适合我.

http://www.codeplex.com/AutoMapper