Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.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# 从ViewModel映射回DTO时的自动映射问题_C#_Asp.net Mvc_Automapper - Fatal编程技术网

C# 从ViewModel映射回DTO时的自动映射问题

C# 从ViewModel映射回DTO时的自动映射问题,c#,asp.net-mvc,automapper,C#,Asp.net Mvc,Automapper,我在映射回DTO时遇到问题 DTO: public class ServiceEntity : BaseChild { public int Id { get; set; } } public class BaseChild { public string FirstName { get; set; } public string LastName { get; set; } public int Salary { get; set; } public

我在映射回DTO时遇到问题

DTO:

public class ServiceEntity : BaseChild
{
    public int Id { get; set; }
}

public class BaseChild
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Salary { get; set; }
    public string BkName { get; set; }
    public int BkPrice { get; set; }
    public string BkDescription { get; set; }
}
视图模型:

public class BusinessEntity 
{
    public ChildBussiness Details { get; set; }
}

public class ChildBussiness
{
    public string NameFirst { get; set; }
    public string LastName { get; set; }
    public Books BookDetails { get; set; }
    public string Salary { get; set; }
}

public class Books
{
    public string BookName { get; set; }
    public int BookPrice { get; set; }
    public string BookDescription { get; set; }
}
控制器

用于使用以下代码从DTO映射到ViewModel im,其工作正常

public ActionResult Index()
{
    ServiceEntity obj = GetData();
    Mapper.CreateMap<ServiceEntity, BusinessEntity>()
        .ForMember(d => d.Details, o => o.MapFrom(x => new ChildBussiness { NameFirst = x.FirstName, LastName = x.LastName, Salary = x.Salary.ToString(), BookDetails = new Books { BookDescription = x.BkDescription, BookName = x.BkName, BookPrice = x.BkPrice }}));

    BusinessEntity objDetails = Mapper.Map<ServiceEntity, BusinessEntity>(obj);
}
public ActionResult Index()
{
ServiceEntity obj=GetData();
Mapper.CreateMap()
.ForMember(d=>d.Details,o=>o.MapFrom(x=>newchildbusiness{NameFirst=x.FirstName,LastName=x.LastName,Salary=x.Salary.ToString(),BookDetails=newbooks{BookDescription=x.BkDescription,BookName=x.BkName,BookPrice=x.BkPrice}});
BusinessEntity objDetails=Mapper.Map(obj);
}
当转换回我不能做。下面是我试过的代码

.
.
.
ServiceEntity objser = new ServiceEntity();

Mapper.CreateMap<BusinessEntity, ServiceEntity>();
Mapper.CreateMap<Books, ServiceEntity>();

objser = Mapper.Map<BusinessEntity, ServiceEntity>(model);
.
.
.
。
.
.
ServiceEntity objser=新ServiceEntity();
CreateMap();
CreateMap();
objser=Mapper.Map(模型);
.
.
.
但是我没有得到任何成功。例如,我提供了一些属性。我想我可能有30多处房产。
任何建议都将不胜感激……

编辑因此您可以更改
业务实体
实现,您可以使用AutoMapper约定和扁平化的功能。以下是修改后的业务实体:

public class BusinessEntity
{
    public string FirstName { get; set; } // Instead of NameFirst
    public string LastName { get; set; }
    public Book Bk { get; set; } // Bk instead of BookDetails
    public string Salary { get; set; }
}

public class Book
{
    public string Name { get; set; } // No prefixes
    public int Price { get; set; }
    public string Description { get; set; }
}
您需要
Bk
name才能将
Bk.name
展平到
BkName
。现在,将在几行中生成所有映射:

// For mapping from service entity to book
Mapper.Initialize(cfg => cfg.RecognizePrefixes("Bk"));

Mapper.CreateMap<BusinessEntity, ServiceEntity>();

// Trick to un-flatten service entity
// It is mapped both to Book and BusinessEnity
Mapper.CreateMap<ServiceEntity, Book>();
Mapper.CreateMap<ServiceEntity, BusinessEntity>()
        .ForMember(d => d.Bk, m => m.MapFrom(s => s));
//用于从服务实体到书本的映射
初始化(cfg=>cfg.RecognizePrefixes(“Bk”);
CreateMap();
//取消扁平化服务实体的技巧
//它被映射到书本和商业性
CreateMap();
Mapper.CreateMap()
.ForMember(d=>d.Bk,m=>m.MapFrom(s=>s));
就这样。所有30个属性将按约定进行映射:

var service = new ServiceEntity {
    FirstName = "Sergey",
    LastName = "Berezovskiy",
    Salary = 5000,
    BkName = "Laziness in Action",
    BkDescription = "...",
    BkPrice = 42
};

var business = Mapper.Map<BusinessEntity>(source);
var anotherService = Mapper.Map<ServiceEntity>(business);
var服务=新服务实体{
FirstName=“Sergey”,
LastName=“别列佐夫斯基”,
工资=5000,
BkName=“行动中的懒惰”,
BkDescription=“…”,
价格=42
};
var business=Mapper.Map(源);
var anotherService=Mapper.Map(业务);
原始答案因此,您正在使用从服务实体到业务实体的自定义映射,那么默认映射也不适用于反向映射。您应该手动为成员提供映射:

Mapper.CreateMap<BusinessEntity, ServiceEntity>()
    .ForMember(d => d.FirstName, m => m.MapFrom(s => s.Details.NameFirst))
    .ForMember(d => d.LastName, m => m.MapFrom(s => s.Details.LastName))
    .ForMember(d => d.Salary, m => m.MapFrom(s => s.Details.Salary))
    .ForMember(d => d.BkName, m => m.MapFrom(s => s.Details.BookDetails.BookName))
    .ForMember(d => d.BkPrice, m => m.MapFrom(s => s.Details.BookDetails.BookPrice))
    .ForMember(d => d.BkDescription, m => m.MapFrom(s => s.Details.BookDetails.BookDescription));
Mapper.CreateMap()
.ForMember(d=>d.FirstName,m=>m.MapFrom(s=>s.Details.NameFirst))
.ForMember(d=>d.LastName,m=>m.MapFrom(s=>s.Details.LastName))
.ForMember(d=>d.Salary,m=>m.MapFrom(s=>s.Details.Salary))
.ForMember(d=>d.BkName,m=>m.MapFrom(s=>s.Details.BookDetails.BookName))
.ForMember(d=>d.BkPrice,m=>m.MapFrom(s=>s.Details.BookDetails.BookPrice))
.ForMember(d=>d.BkDescription,m=>m.MapFrom(s=>s.Details.BookDetails.BookDescription));

但我认为在这种情况下,手动映射比为单个属性提供所有这些映射更好。

是否有任何错误或只是空属性?如果所有属性都使用im映射,那么我为什么要使用AutoMapper,而不是通过创建实例直接绑定。@user2640897这就是我编写的原因“但我认为在这种情况下,手动映射更好“我又找到了一个解决办法。我只是在BUsinessEntity中继承了childbusiness&并相应地映射,而不是在BUsinessEntity中使用属性。这样你就可以编辑业务实体,然后你就可以使用我更新的答案了谢谢你的解决方案lazyberezovsky。上面的解决方案似乎和我现在实现的一样。我继承了商业实体中的儿童业务,并据此使用。