我正在使用MVVM模式构建WPF应用程序。我们的堆栈看起来像这样:
SQL Server 2008 - >实体框架
我们使用StructureMap进行依赖注入来注入我们的DataFactory,它基本上为我们的POCO业务对象做了CRUD。
ViewModels使用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();
}
基本上我会删除将数据从业务对象移动到实体框架工作对象的代码,它将在映射类中完成一次,并且不必为每个方法重复。
谢谢!
答案 0 :(得分:11)
你可以试试Automapper,适合我。
答案 1 :(得分:1)
虽然我不知道数据映射器可以为EF做什么,但编写一个并不困难。此外,由于定义映射是大部分工作,因此它实际上并不比使用您列出的流畅接口映射更难。您只需创建一个具有多个映射函数的Mapper类,每个映射函数都包含您的映射逻辑。
可能有趣的一个想法是制作地图函数扩展方法。您仍然会创建一个Mapper类,但每个map方法都看起来像
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();