Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在不同的情况下映射不同_C#_Entity Framework_Automapper - Fatal编程技术网

C# 在不同的情况下映射不同

C# 在不同的情况下映射不同,c#,entity-framework,automapper,C#,Entity Framework,Automapper,我们为API将实体映射到模型。当一个实体是另一个实体的子实体时,我们通常使用一个只有显示名称和id的通用模型。我想做的是,如果该实体是某一类型的子实体而不是另一类型的子实体,则映射该显示名称。除了为此目的专门创建一个新的通用模型外,还有其他方法可以做到这一点吗 实体示例 范例 地图注册示例 Mapper.CreateMap(); CreateMap(); CreateMap(); CreateMap(); //这是我目前的解决办法,但如果可能的话,我想少用一些型号。 Mapper.CreateM

我们为API将实体映射到模型。当一个实体是另一个实体的子实体时,我们通常使用一个只有显示名称和id的通用模型。我想做的是,如果该实体是某一类型的子实体而不是另一类型的子实体,则映射该显示名称。除了为此目的专门创建一个新的通用模型外,还有其他方法可以做到这一点吗

实体示例 范例 地图注册示例
Mapper.CreateMap();
CreateMap();
CreateMap();
CreateMap();
//这是我目前的解决办法,但如果可能的话,我想少用一些型号。
Mapper.CreateMap().formMember(x=>x.DisplayName,x=>x.MapFrom(y=>y.FirstName+''+y.LastName));
CreateMap();
//我想做的是:
//Mapper.CreateMap().formMember(x=>x.Contact.DisplayName,x=>x.MapFrom(y=>y.Contact.FirstName+''+y.Contact.LastName));
//此错误为“表达式必须解析为顶级成员,而不是任何子对象的属性。”

您可以使用投影为特定成员自定义映射:


您可以使用投影为特定成员自定义映射:


您可以使用
AfterMap
(或
BeforeMap
)来完成以下任务:

Mapper.CreateMap<Employee, EmployeeModel()
    .ForMember(dest => dest.Contact.DisplayName, config => config.Ignore())
    .AfterMap((src, dest) => 
        dest.Contact.DisplayName = src.Contact.FirstName + " " + src.Contact.LastName);
Mapper.CreateMap dest.Contact.DisplayName,config=>config.Ignore()
.AfterMap((src,dest)=>
dest.Contact.DisplayName=src.Contact.FirstName+“”+src.Contact.LastName);

您可以使用
AfterMap
(或
BeforeMap
)来完成以下任务:

Mapper.CreateMap<Employee, EmployeeModel()
    .ForMember(dest => dest.Contact.DisplayName, config => config.Ignore())
    .AfterMap((src, dest) => 
        dest.Contact.DisplayName = src.Contact.FirstName + " " + src.Contact.LastName);
Mapper.CreateMap dest.Contact.DisplayName,config=>config.Ignore()
.AfterMap((src,dest)=>
dest.Contact.DisplayName=src.Contact.FirstName+“”+src.Contact.LastName);

看起来您正在尝试配置子属性,AutoMapper不是这样工作的。创建映射时,配置的是目标类型的成员,而不是子对象

你的声明“我想少买些型号”


不要。为特定配置的特定情况创建模型。这就是重点。根据这些情况和配置命名目标类型。添加额外的目标模型类型并不是一个很大的成本,但复杂的配置是一个心理成本。

看起来您正在尝试配置子属性,AutoMapper不是这样工作的。创建映射时,配置的是目标类型的成员,而不是子对象

你的声明“我想少买些型号”


不要。为特定配置的特定情况创建模型。这就是重点。根据这些情况和配置命名目标类型。添加额外的目标模型类型并不是一个很大的成本,但复杂的配置是一个心理成本。

我最初尝试过这一点,但因为我尝试的映射是在一个孩子身上进行的,所以它不起作用。具体地说,它给了我一个错误“表达式必须解析为顶级成员,而不是任何子对象的属性。”你能发布一些示例代码吗?我很难理解你到底想做什么。添加到原始帖子中。其他答案有用吗?我最初尝试过这个,但因为我试图在一个孩子身上做的映射不起作用。具体来说,它给了我一个错误“表达式必须解析为顶级成员,而不是任何子对象的属性”。你能发布一些示例代码吗?我很难理解你到底想做什么。添加到原始帖子中。其他答案有帮助吗?
Mapper.CreateMap<CompanyName, CompanyNameModel>();
Mapper.CreateMap<CompanyName, XSModel>();
Mapper.CreateMap<Contact, ContactModel>();
Mapper.CreateMap<Contact, XSModel>();
// This is my current workaround, but I'd like to get away with less models if possible.
Mapper.CreateMap<Contact, XSContactNoCompanyModel>().ForMember(x => x.DisplayName, x => x.MapFrom(y => y.FirstName + ' ' + y.LastName));
Mapper.CreateMap<Employee, EmployeeModel>();

// What I'm trying to do:
//Mapper.CreateMap<Employee, EmployeeModel>().ForMember(x => x.Contact.DisplayName, x => x.MapFrom(y => y.Contact.FirstName + ' ' + y.Contact.LastName));
// This errors with 'Expression must resolve to top-level member and not any child object's properties.'
Mapper.CreateMap<Employee, EmployeeModel()
    .ForMember(dest => dest.Contact.DisplayName, config => config.Ignore())
    .AfterMap((src, dest) => 
        dest.Contact.DisplayName = src.Contact.FirstName + " " + src.Contact.LastName);