8

我正在使用 MVVM 模式构建 WPF 应用程序。我们的堆栈如下所示:

SQL Server 2008 -> 实体框架

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

ViewModel 将 DataFactory 用于 CRUD,而 xaml 是绑定到 POCO 中的属性的数据。

整个事情都很好,但我发现唯一有点烦人的是数据工厂。我们在选择时将 EF 对象中的每个属性复制到 POCO 中,而在更新/插入时则相反。

有没有办法像 Fluent 对 NHibernate 但使用实体框架一样自动化这个过程?

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

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

声明一些类会很好,就像 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);  
  }  
}

最后我的插入方法看起来像这样:

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

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

谢谢!

4

2 回答 2

12

你可以试试 Automapper,对我有用。

http://www.codeplex.com/AutoMapper

于 2009-05-01T19:43:33.857 回答
1

虽然我不知道有一个数据映射器可以为 EF 做你想要的,但编写一个并不难。此外,由于定义映射是大部分工作,因此实际上并不比使用您列出的流畅接口映射更难。您只需创建一个具有多个映射函数的 Mapper 类,每个映射函数都包含您的映射逻辑。

一种可能有趣的想法是使您的地图函数扩展方法。您仍然会创建一个 Mapper 类,但每个映射方法看起来像

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

由于 MapToPerson 方法是扩展方法,而不是真正的 bizObject 类上的方法,因此您不会破坏 POCO。但是,由于扩展方法的语法糖,您的 InsertCustomer 方法可能具有如下代码:

    Customer customer = bizObject.MapToCustomer();
    Person person = bizObject.MapToPerson();
于 2009-04-26T06:05:39.230 回答