簡體   English   中英

使用AutoMapper映射N對N關系

[英]Mapping N to N relationships with AutoMapper

我在用c#,automapper和postgreSQL ef核心做一個小例子。 我的實體是客戶,產品,銷售,sales_products。

我已經完成了客​​戶和產品的映射,但是我不知道如何映射銷​​售和產品之間的n對n關系。

這是我的代碼:

銷售實體:

public partial class Sales
{
    public Sales()
    {
        SalesProducts = new HashSet<SalesProducts>();
    }

    public int SaleId { get; set; }
    public int? ClientId { get; set; }
    public float TotalPrice { get; set; }
    public DateTime? Date { get; set; }

    public Clients Client { get; set; }
    public ICollection<SalesProducts> SalesProducts { get; set; }
}

產品實體:

public partial class Products
{
    public Products()
    {
        SalesProducts = new HashSet<SalesProducts>();
    }

    public int ProductId { get; set; }
    public string ProductName { get; set; }
    public string Description { get; set; }
    public float Price { get; set; }
    public int Quant { get; set; }

    public ICollection<SalesProducts> SalesProducts { get; set; }
}

SalesProducts實體:

public partial class SalesProducts
{
    public int ProductId { get; set; }
    public int SaleId { get; set; }
    public int? Quantity { get; set; }

    public Products Product { get; set; }
    public Sales Sale { get; set; }
}

產品型號:

public class Products
{
    public int ProductId { get; set; }
    public string ProductName { get; set; }
    public string Description { get; set; }
    public float Price { get; set; }
    public int Quant { get; set; }
}

銷售模式:

public class Sales
{
    public int SaleId { get; set; }
    public Clients Client { get; set; }
    public float TotalPrice { get; set; }
    public DateTime? Date { get; set; }

    public List<Products> Product { get; set; }
}

銷售產品型號:

public class SalesProducts
{
    public int SaleId { get; set; }
    public int ProductId { get; set; }
    public int Quant { get; set; }
}

我試圖進行映射,但是它始終會給未映射的產品帶來錯誤:

public class SalesProfiles : Profile
{
    public SalesProfiles()
    {
        CreateMap<DataModels.SalesProducts, Models.SalesProducts>();

        CreateMap<DataModels.Sales, Models.SalesProducts>()
            .ForMember(dest => dest.SaleId, opt => opt.MapFrom(src => src.SaleId))
            .ReverseMap();

        CreateMap<DataModels.Products, Models.SalesProducts>()
            .ForMember(dest => dest.ProductId, opt => opt.MapFrom(src => src.ProductId))
            .ReverseMap();

        CreateMap<DataModels.Sales, Models.Sales>()
            .ForMember(dest => dest.SaleId, opt => opt.MapFrom(src => src.SaleId))
            .ForMember(dest => dest.Client, opt => opt.MapFrom(src => src.Client))
            .ForMember(dest => dest.Date, opt => opt.MapFrom(src => src.Date))
            .ForMember(dest => dest.TotalPrice, opt => opt.MapFrom(src => src.TotalPrice))
            .ForMember(dest => dest.Product, opt => opt.MapFrom(src => src.SalesProducts.Select(x => x.Product).ToList()));
    }
}

產品映射:

public class ProductsProfiles : Profile
{
    public ProductsProfiles()
    {
        CreateMap<Models.Products, BindingModels.Products>()
            .ForMember(dest => dest.ProductName, opt => opt.MapFrom(src => src.ProductName))
            .ForMember(dest => dest.Description, opt => opt.MapFrom(src => src.Description))
            .ForMember(dest => dest.Quant, opt => opt.MapFrom(src => src.Quant))
            .ForMember(dest => dest.Price, opt => opt.MapFrom(src => src.Price))
            .ReverseMap();

        CreateMap<Models.Products, DataModels.Products>()
            .ForMember(dest => dest.ProductId, opt => opt.MapFrom(src => src.ProductId))
            .ForMember(dest => dest.ProductName, opt => opt.MapFrom(src => src.ProductName))
            .ForMember(dest => dest.Description, opt => opt.MapFrom(src => src.Description))
            .ForMember(dest => dest.Quant, opt => opt.MapFrom(src => src.Quant))
            .ForMember(dest => dest.Price, opt => opt.MapFrom(src => src.Price))
            .ReverseMap();

        CreateMap<BindingModels.Products, DataModels.Products>()
            .ForMember(dest => dest.ProductName, opt => opt.MapFrom(src => src.ProductName))
            .ForMember(dest => dest.Description, opt => opt.MapFrom(src => src.Description))
            .ForMember(dest => dest.Quant, opt => opt.MapFrom(src => src.Quant))
            .ForMember(dest => dest.Price, opt => opt.MapFrom(src => src.Price))
            .ReverseMap();

        CreateMap<DataModels.Products, Models.Products>()
            .ForMember(dest => dest.ProductId, opt => opt.MapFrom(src => src.ProductId))
            .ForMember(dest => dest.ProductName, opt => opt.MapFrom(src => src.ProductName))
            .ForMember(dest => dest.Description, opt => opt.MapFrom(src => src.Description))
            .ForMember(dest => dest.Quant, opt => opt.MapFrom(src => src.Quant))
            .ForMember(dest => dest.Price, opt => opt.MapFrom(src => src.Price))
            .ReverseMap();
    }
}

客戶映射:

public class ClientsProfiles : Profile
{
    public ClientsProfiles()
    {
        CreateMap<Models.Clients, BindingModels.Clients>()
            .ForMember(dest => dest.FirstName, opt => opt.MapFrom(src => src.FirstName))
            .ForMember(dest => dest.LastName, opt => opt.MapFrom(src => src.LastName))
            .ForMember(dest => dest.BirthDate, opt => opt.MapFrom(src => src.BirthDate))
            .ReverseMap();

        CreateMap<Models.Clients, DataModels.Clients>()
            .ForMember(dest => dest.ClientId, opt => opt.MapFrom(src => src.ClientId))
            .ForMember(dest => dest.FirstName, opt => opt.MapFrom(src => src.FirstName))
            .ForMember(dest => dest.LastName, opt => opt.MapFrom(src => src.LastName))
            .ForMember(dest => dest.BirthDate, opt => opt.MapFrom(src => src.BirthDate))
            .ReverseMap();

        CreateMap<BindingModels.Clients, DataModels.Clients>()
            .ForMember(dest => dest.FirstName, opt => opt.MapFrom(src => src.FirstName))
            .ForMember(dest => dest.LastName, opt => opt.MapFrom(src => src.LastName))
            .ForMember(dest => dest.BirthDate, opt => opt.MapFrom(src => src.BirthDate))
            .ReverseMap();

        CreateMap<DataModels.Clients, Models.Clients>()
            .ForMember(dest => dest.ClientId, opt => opt.MapFrom(src => src.ClientId))
            .ForMember(dest => dest.FirstName, opt => opt.MapFrom(src => src.FirstName))
            .ForMember(dest => dest.LastName, opt => opt.MapFrom(src => src.LastName))
            .ForMember(dest => dest.BirthDate, opt => opt.MapFrom(src => src.BirthDate))
            .ReverseMap();
    }
}

有人知道我該如何正確映射嗎?

我試圖進行映射,但是它始終會給未映射的產品帶來錯誤:

您已經為如何映射兩個SalesProducts類定義了一個映射,但是它們具有不同的屬性,因此您將需要定義如何映射這些屬性。

CreateMap<DataModels.SalesProducts, Models.SalesProducts>();

具體來說,您的一個SalesProducts具有“ ProductSale屬性,而另一個則沒有。 您可以將其標記為“忽略”,因為否則您希望如何從不具有這些屬性的類中創建它?

您也沒有從DataModels.ProductModels.Product的映射...這可能是您的錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM