将AutoMapper与EF6 DbFirst和存储过程一起使用(复杂类型)

时间:2015-01-16 04:30:20

标签: c# asp.net-mvc entity-framework automapper ef-database-first

我正在使用Entity Framework 6 DBFirst,MVC5和AutoMapper。

我有2个表,Customers和CustomerContacts 对于我在Entity Framework EDMX(自动生成)中的每个类,我有一个具有完全相同属性的Model类。即客户=> Model.Customer,CustomerContact => Model.CustomerContact。这就是我使用AutoMapper的原因。

问题1:由于我的Customer_Get存储过程返回一个自动生成的复杂类型(Customer_Get_Result),大多数人还会为此创建一个额外的模型类吗? (Model.Customer_Get_Result.cs)或者所有属性应该合并为Model.Customer添加所有东西?

问题2:我处理客户联系人映射的方式是否正确?大多数Model.Customer中的每个属性都与AutoGenerated EF6 DBFirst文件完全相同,除了我放在Model.Customer中的这个:

public List<CustomerContact> Contacts { get; set; }

最后,我希望能够使用Customer.Contacts自动获取所有客户联系人的列表

在我的AutoMapper中,我试图做这样的事情,但不认为这是正确的:

    CreateMap<Customer, Model.Customer>()
        .ForMember(dest => dest.Contacts, opt => opt.MapFrom(src => src.CustomerContact));

    //map for customer getlist stored proc which will be returning several fields
    //such as TotalCount, RowNumber, fields from a bunch of other tables
    CreateMap<Customer_Get_Result, Model.Customer>();

1 个答案:

答案 0 :(得分:2)

  

对于存储过程的复杂类型(Customer_Get_Result)最多   人们还为此制作了一个额外的模型类?

如果它与Customer完全相同,那么我可能不会为它创建一个模型,只需将其映射到现有模型。

虽然它取决于您对此Model类的操作,以及从实体映射的数据的用例是否与从存储过程映射的数据不同。模型只是POCO的一个奇特术语。模型通常是两件事之一。实体的简化,比EF实体更接近POCO;例如您可以在业务层和数据库层之间使用的DTO。或者它是特定上下文的特化,例如ViewModel,它只具有特定视图所需的属性,并且通常包含特定于UI的数据注释等内容。

这取决于您的应用程序如何分层以及应用程序的哪个部分正在检索数据,以及它计划对该数据执行的操作。也就是说,我可能从使用相同的模型开始,看看我是否觉得以后需要变形(但是你仍然需要2个映射,一个来自SP_Complex_Type - &gt;模型,还有一个实体 - &gt;模型)。

您的DB / EF模型看起来只有来自Customer.CustomerContact的单个相关联系人,但您的模型具有一对多关系Model.Customer.Contacts。我基于多个属性名称,因为您没有向我们提供您的实体的任何声明。无论哪种方式,您的EF实体支持的关系与您的模型支持的关系不匹配。使用AutoMapper可以在这里做很多不同的事情,但是你不能做出这个决定,直到你弄清楚为什么有一个相关联系人列表,而另一个只有一个相关联系人。

CreateMap<Customer, Model.Customer>()
        .ForMember(dest => dest.Contacts, opt => opt.MapFrom(src => src.CustomerContact));

将列表映射到列表,并且属性的命名方式不同时,上面的内容就是您要做的。此外,如果每个列表中的类型不同,那么您还需要确保先前为这些类型声明了地图。例如,如果您从List<CustomerContactEntity>转到List<CustomerContactModel>,那么您需要已经完成CreateMap<CustomerContactEntity,CustomerContactModel>告诉AutoMapper它可以转换这些类型。这样,当它遇到列表中的每个项目时,它将看到它具有该子类型的映射。