Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.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
Entity 如何使用AutoMapper映射到具有继承和嵌套模型的模型_Entity_Viewmodel_Automapper - Fatal编程技术网

Entity 如何使用AutoMapper映射到具有继承和嵌套模型的模型

Entity 如何使用AutoMapper映射到具有继承和嵌套模型的模型,entity,viewmodel,automapper,Entity,Viewmodel,Automapper,我有一个包含2个子类型的地址实体。以下是我的简化代码: public class Address { public string Street1 { get; set; } public string Country { get; set; } } public class UsAddress : Address { public string State { get; set; } } public class CandianAddress : Address {

我有一个包含2个子类型的地址实体。以下是我的简化代码:

public class Address {
    public string Street1 { get; set; }
    public string Country { get; set; }
}
public class UsAddress : Address {
    public string State { get; set; }
}
public class CandianAddress : Address {
    public string Providence { get; set; }
}
以下是我的简化视图模型:

public class LocationModel {
    public string Street1 { get; set; }
}
public class UsLocationModel : LocationModel {
    public string State { get; set; }
}
public class CaLocationModel : LocationModel {
    public string Providence { get; set; }
}
public class AddressModel {
    public int? Country { get; set; }
    public UsLocationModel UsLocation { get; set; }
    public CaLocationModel CaLocation { get; set; }
}
以下是我的简化自动映射配置:

Mapper.CreateMap<Address, AddressModel>()
            .Include<UsAddress, AddressModel>()
            .Include<CanadianAddress, AddressModel>();
Mapper.CreateMap<UsAddress, AddressModel>();
Mapper.CreateMap<CanadianAddress, AddressModel>();
Mapper.CreateMap<Address, LocationModel>()
            .Include<UsAddress, USLocationModel>()
            .Include<CanadianAddress, CALocationModel>();
Mapper.CreateMap<UsAddress, USLocationModel>();
Mapper.CreateMap<CanadianAddress, CALocationModel>();
Mapper.CreateMap<Address, AddressModel>()
    .Include<UsAddress, AddressModel>()
    .Include<CanadianAddress, AddressModel>()
    .ForMember(x => x.USLocation, a => a.Ignore())
    .ForMember(x => x.CALocation, a => a.Ignore())
    .ForMember(x => x.Country, a => a.ResolveUsing<HaveIdValueResolver<Country, int>>().FromMember(x => x.Country);
Mapper.CreateMap<UsAddress, AddressModel>()
    .ForMember(x => x.USLocation, a => a.MapFrom(Mapper.Map<UsAddress, USLocationModel>))
    .ForMember(x => x.CALocation, a => a.Ignore())
    .ForMember(x => x.Country, a => a.ResolveUsing<HaveIdValueResolver<Country, int>>().FromMember(x => x.Country));
Mapper.CreateMap<CanadianAddress, AddressModel>()
    .ForMember(x => x.USLocation, a => a.Ignore())
    .ForMember(x => x.CALocation, a => a.MapFrom(Mapper.Map<CanadianAddress, CALocationModel>))
    .ForMember(x => x.Country, a => a.ResolveUsing<HaveIdValueResolver<Country, int>>().FromMember(x => x.Country));
Mapper.CreateMap<Address, LocationModel>()
    .Include<UsAddress, USLocationModel>()
    .Include<CanadianAddress, CALocationModel>();
Mapper.CreateMap<UsAddress, USLocationModel>();
Mapper.CreateMap<CanadianAddress, CALocationModel>();
Mapper.CreateMap()
.包括()
.Include();
CreateMap();
CreateMap();
Mapper.CreateMap()
.包括()
.Include();
CreateMap();
CreateMap();

我想不出如何解析
AddressModel
上的
UsLocation
CaLocation
属性……

我想出来了。以下是我的Automapper配置的简化版本:

Mapper.CreateMap<Address, AddressModel>()
            .Include<UsAddress, AddressModel>()
            .Include<CanadianAddress, AddressModel>();
Mapper.CreateMap<UsAddress, AddressModel>();
Mapper.CreateMap<CanadianAddress, AddressModel>();
Mapper.CreateMap<Address, LocationModel>()
            .Include<UsAddress, USLocationModel>()
            .Include<CanadianAddress, CALocationModel>();
Mapper.CreateMap<UsAddress, USLocationModel>();
Mapper.CreateMap<CanadianAddress, CALocationModel>();
Mapper.CreateMap<Address, AddressModel>()
    .Include<UsAddress, AddressModel>()
    .Include<CanadianAddress, AddressModel>()
    .ForMember(x => x.USLocation, a => a.Ignore())
    .ForMember(x => x.CALocation, a => a.Ignore())
    .ForMember(x => x.Country, a => a.ResolveUsing<HaveIdValueResolver<Country, int>>().FromMember(x => x.Country);
Mapper.CreateMap<UsAddress, AddressModel>()
    .ForMember(x => x.USLocation, a => a.MapFrom(Mapper.Map<UsAddress, USLocationModel>))
    .ForMember(x => x.CALocation, a => a.Ignore())
    .ForMember(x => x.Country, a => a.ResolveUsing<HaveIdValueResolver<Country, int>>().FromMember(x => x.Country));
Mapper.CreateMap<CanadianAddress, AddressModel>()
    .ForMember(x => x.USLocation, a => a.Ignore())
    .ForMember(x => x.CALocation, a => a.MapFrom(Mapper.Map<CanadianAddress, CALocationModel>))
    .ForMember(x => x.Country, a => a.ResolveUsing<HaveIdValueResolver<Country, int>>().FromMember(x => x.Country));
Mapper.CreateMap<Address, LocationModel>()
    .Include<UsAddress, USLocationModel>()
    .Include<CanadianAddress, CALocationModel>();
Mapper.CreateMap<UsAddress, USLocationModel>();
Mapper.CreateMap<CanadianAddress, CALocationModel>();
Mapper.CreateMap()
.包括()
.包括()
.ForMember(x=>x.USLocation,a=>a.Ignore())
.ForMember(x=>x.CALocation,a=>a.Ignore())
.ForMember(x=>x.Country,a=>a.resolvusing().FromMember(x=>x.Country);
Mapper.CreateMap()
.ForMember(x=>x.USLocation,a=>a.MapFrom(Mapper.Map))
.ForMember(x=>x.CALocation,a=>a.Ignore())
.ForMember(x=>x.Country,a=>a.resolvusing().FromMember(x=>x.Country));
Mapper.CreateMap()
.ForMember(x=>x.USLocation,a=>a.Ignore())
.ForMember(x=>x.CALocation,a=>a.MapFrom(Mapper.Map))
.ForMember(x=>x.Country,a=>a.resolvusing().FromMember(x=>x.Country));
Mapper.CreateMap()
.包括()
.Include();
CreateMap();
CreateMap();
下面是一个简化的示例测试:

var usAddress = new FakeUsAddress("111 L St", new FakeState(id: 17));
var addressModel = Mapper.Map<UsAddress, AddressModel>(usAddress);
Assert.IsNotNull(addressModel.USLocationModel);
Assert.IsNull(addressModel.CALocationModel);
Assert.AreEqual(usAddress.Street1, addressModel.USLocationModel.Street1);
Assert.AreEqual(usAddress.State.Id, addressModel.USLocationModel.State);
Assert.AreEqual(usAddress.Country.Id, addressModel.USLocationModel.Country);
var-usAddress=new-FakeUsAddress(“111 L St”,new-FakeState(id:17));
var addressModel=Mapper.Map(usAddress);
Assert.IsNotNull(addressModel.USLocationModel);
IsNull(addressModel.CalLocationModel);
AreEqual(usAddress.Street1,addressModel.USLocationModel.Street1);
AreEqual(usAddress.State.Id,addressModel.USLocationModel.State);
AreEqual(usAddress.Country.Id,addressModel.USLocationModel.Country);

我找到了答案。以下是我的Automapper配置的简化版本:

Mapper.CreateMap<Address, AddressModel>()
            .Include<UsAddress, AddressModel>()
            .Include<CanadianAddress, AddressModel>();
Mapper.CreateMap<UsAddress, AddressModel>();
Mapper.CreateMap<CanadianAddress, AddressModel>();
Mapper.CreateMap<Address, LocationModel>()
            .Include<UsAddress, USLocationModel>()
            .Include<CanadianAddress, CALocationModel>();
Mapper.CreateMap<UsAddress, USLocationModel>();
Mapper.CreateMap<CanadianAddress, CALocationModel>();
Mapper.CreateMap<Address, AddressModel>()
    .Include<UsAddress, AddressModel>()
    .Include<CanadianAddress, AddressModel>()
    .ForMember(x => x.USLocation, a => a.Ignore())
    .ForMember(x => x.CALocation, a => a.Ignore())
    .ForMember(x => x.Country, a => a.ResolveUsing<HaveIdValueResolver<Country, int>>().FromMember(x => x.Country);
Mapper.CreateMap<UsAddress, AddressModel>()
    .ForMember(x => x.USLocation, a => a.MapFrom(Mapper.Map<UsAddress, USLocationModel>))
    .ForMember(x => x.CALocation, a => a.Ignore())
    .ForMember(x => x.Country, a => a.ResolveUsing<HaveIdValueResolver<Country, int>>().FromMember(x => x.Country));
Mapper.CreateMap<CanadianAddress, AddressModel>()
    .ForMember(x => x.USLocation, a => a.Ignore())
    .ForMember(x => x.CALocation, a => a.MapFrom(Mapper.Map<CanadianAddress, CALocationModel>))
    .ForMember(x => x.Country, a => a.ResolveUsing<HaveIdValueResolver<Country, int>>().FromMember(x => x.Country));
Mapper.CreateMap<Address, LocationModel>()
    .Include<UsAddress, USLocationModel>()
    .Include<CanadianAddress, CALocationModel>();
Mapper.CreateMap<UsAddress, USLocationModel>();
Mapper.CreateMap<CanadianAddress, CALocationModel>();
Mapper.CreateMap()
.包括()
.包括()
.ForMember(x=>x.USLocation,a=>a.Ignore())
.ForMember(x=>x.CALocation,a=>a.Ignore())
.ForMember(x=>x.Country,a=>a.resolvusing().FromMember(x=>x.Country);
Mapper.CreateMap()
.ForMember(x=>x.USLocation,a=>a.MapFrom(Mapper.Map))
.ForMember(x=>x.CALocation,a=>a.Ignore())
.ForMember(x=>x.Country,a=>a.resolvusing().FromMember(x=>x.Country));
Mapper.CreateMap()
.ForMember(x=>x.USLocation,a=>a.Ignore())
.ForMember(x=>x.CALocation,a=>a.MapFrom(Mapper.Map))
.ForMember(x=>x.Country,a=>a.resolvusing().FromMember(x=>x.Country));
Mapper.CreateMap()
.包括()
.Include();
CreateMap();
CreateMap();
下面是一个简化的示例测试:

var usAddress = new FakeUsAddress("111 L St", new FakeState(id: 17));
var addressModel = Mapper.Map<UsAddress, AddressModel>(usAddress);
Assert.IsNotNull(addressModel.USLocationModel);
Assert.IsNull(addressModel.CALocationModel);
Assert.AreEqual(usAddress.Street1, addressModel.USLocationModel.Street1);
Assert.AreEqual(usAddress.State.Id, addressModel.USLocationModel.State);
Assert.AreEqual(usAddress.Country.Id, addressModel.USLocationModel.Country);
var-usAddress=new-FakeUsAddress(“111 L St”,new-FakeState(id:17));
var addressModel=Mapper.Map(usAddress);
Assert.IsNotNull(addressModel.USLocationModel);
IsNull(addressModel.CalLocationModel);
AreEqual(usAddress.Street1,addressModel.USLocationModel.Street1);
AreEqual(usAddress.State.Id,addressModel.USLocationModel.State);
AreEqual(usAddress.Country.Id,addressModel.USLocationModel.Country);