繁体   English   中英

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

[英]Using AutoMapper with EF6 DbFirst and Stored Procedure (complex types)

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

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

问题1:由于我的Customer_Get存储过程返回了自动生成的复杂类型(Customer_Get_Result),因此大多数人还会为此添加一个附加的模型类吗? (Model.Customer_Get_Result.cs)还是应该合并所有属性,从而将所有内容添加到Model.Customer?

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

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

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

在我的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>();

对于存储过程的复杂类型(Customer_Get_Result),大多数人还会为此添加一个附加的模型类吗?

如果它的属性与Customer完全相同,那么我可能不会仅为其创建模型,而是将其映射到现有模型。

尽管这取决于您对Model类的处理方式,以及从实体映射的数据的用例是否不同于从存储过程映射的数据的用例。 模型只是POCO的幻想术语。 模型通常是两件事之一。 实体的简化,比EF实体更接近POCO; 例如DTO,您可能会在业务层和数据库层之间使用。 或它是针对特定上下文的专业化,例如ViewModel,它仅具有特定视图所需的属性,并且通常包括特定于UI的数据注释之类的内容。

这很大程度上取决于您的应用程序如何分层以及应用程序的哪个部分正在检索数据,以及它打算如何处理该数据。 就是说,我可能会从仅使用相同的模型开始,看看以后是否需要重构(但是您仍然需要2个映射,其中1个来自SP_Complex_Type-> Model,1个是Entity-> Model)。

看起来您的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可以转换这些类型。 这样,当它遇到列表中的每个项目时,将看到它具有该子类型的映射。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM