C# 自动映射多对多

C# 自动映射多对多,c#,many-to-many,automapper,C#,Many To Many,Automapper,我一直想让它工作太久了。我已经看了所有我能找到的汽车制造商的问题,但仍然没有运气 如何配置Automapper,使其能够在我的业务实体和数据库模型之间正确映射我的多对多属性? 我正在使用数据库优先数据模型的存储库模式 我有这些实体对象: public class User { public int Id { get; set; } public string Name { get; set; } public string Email { get; set; }

我一直想让它工作太久了。我已经看了所有我能找到的汽车制造商的问题,但仍然没有运气

如何配置Automapper,使其能够在我的业务实体和数据库模型之间正确映射我的多对多属性?
我正在使用数据库优先数据模型的存储库模式

我有这些实体对象:

 public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
    public DateTime CreateDate { get { return DateTime.Now; } private set { } }
    public List<Department> Departments { get; set; }
    public List<Company> Companies { get; set; }
}

  public class Department
{
    public int Id { get; set; }
    public string Name { get; set; }
    public DateTime CreateDate { get { return DateTime.Now; } private set { } }
}

public class Company
{
    public int Id { get; set; }
    public string Name { get; set; }
    public DateTime CreateDate { get { return DateTime.Now; } private set { } }
}
公共类用户
{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共字符串电子邮件{get;set;}
public DateTime CreateDate{get{return DateTime.Now;}private set{}
公共列表部门{get;set;}
上市公司{get;set;}
}
公共课系
{
公共int Id{get;set;}
公共字符串名称{get;set;}
public DateTime CreateDate{get{return DateTime.Now;}private set{}
}
公营公司
{
公共int Id{get;set;}
公共字符串名称{get;set;}
public DateTime CreateDate{get{return DateTime.Now;}private set{}
}
我需要能够更新这些。我需要将它们映射到db对象,以便更新用户

 public partial class User{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
    public Nullable<System.DateTime> CreateDate { get; set; }


    public virtual ICollection<UsersCompany> UsersCompanies { get; set; }

    public virtual ICollection<UsersDepartment> UsersDepartments { get; set; }
}

public partial class UsersCompany
{
    public int Id { get; set; }
    public int UserId { get; set; }
    public int CompanyId { get; set; }

    public virtual Company Company { get; set; }
    public virtual User User { get; set; }
}

public partial class UsersDepartment
{
    public int Id { get; set; }
    public int UserId { get; set; }
    public int DepartmentId { get; set; }

    public virtual Department Department { get; set; }
    public virtual User User { get; set; }
}
公共部分类用户{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共字符串电子邮件{get;set;}
公共可为空的CreateDate{get;set;}
公共虚拟ICollection用户公司{get;set;}
公共虚拟ICollection UsersDepartments{get;set;}
}
公共部分类用户公司
{
公共int Id{get;set;}
public int UserId{get;set;}
public int CompanyId{get;set;}
公共虚拟公司公司{get;set;}
公共虚拟用户用户{get;set;}
}
公共部分类UsersDepartment
{
公共int Id{get;set;}
public int UserId{get;set;}
public int DepartmentId{get;set;}
公共虚拟部门部门{get;set;}
公共虚拟用户用户{get;set;}
}
我有一个方法,在其中我传递实体并尝试将其映射到db模型。这就是我现在所做的,在大约100次尝试让automapper礼貌地映射我的连接表之后…没有运气

private DBUser ToDataModel(User user)
    {

        var config = new MapperConfiguration(cfg =>
        {

            cfg.CreateMap<User, DBUser>()
            .ForMember(dest => dest.UsersDepartments, opt => opt.MapFrom(x => x.Departments));


            cfg.CreateMap<User, DBUsersDepartment>()
                .ForMember(x => x.User, y => y.MapFrom(z => z));


            cfg.CreateMap<Department, DBUsersDepartment>();


        });
        IMapper mapper = config.CreateMapper();

        return mapper.Map<DBUser>(user);
    }
私有数据库用户到数据模型(用户)
{
var config=new-MapperConfiguration(cfg=>
{
cfg.CreateMap()
.formmember(dest=>dest.UsersDepartments,opt=>opt.MapFrom(x=>x.Departments));
cfg.CreateMap()
.ForMember(x=>x.User,y=>y.MapFrom(z=>z));
CreateMap();
});
IMapper mapper=config.CreateMapper();
返回mapper.Map(用户);
}
这是我在“映射”后看到的(注意,没有映射用户信息):

您正在从

public class Department{
    public int Id { get; set; }
    public string Name { get; set; }
    public DateTime CreateDate { get { return DateTime.Now; } private set { }
}

}

因此,在映射
部门时
→<代码>用户部门

公共虚拟用户用户{get;set;}
公共虚拟部门部门{get;set;}
将为空


此外,每次调用
private DBUser-ToDataModel(User-User)
时都会创建一个映射器,这是非常低效的。请考虑,在您的应用程序开始时创建您的映射程序,例如,如果在感兴趣的任何人中使用“<代码> Global”。AASX < /COD> ET/< P> > P>。我最终选择了不同的路线,分别更新每个集合,然后更新基本用户类。
…现在进入下一期。

如果您仍想知道未来问题的可能解决方案,请对代码进行必要的更改,以使其正常工作。 当您的DTO类用户使用直接相关的DTOs部门和公司时,您的DB类USerDb使用许多映射UsersDepartment和UsersCompany

public class User

{
...
public List<Department> Departments { get; set; }
public List<Company> Companies { get; set; }
}

public class DbUser
{
...
public List<UsersDepartment> UsersDepartments { get; set; }
public List<UsersCompany> UsersCompanies { get; set; }
}

cfg.CreateMap<UserDb, User>()
    .ForMember(dest => dest.Departments, opt => opt.MapFrom(user => user.UsersDepartments.Select(userDepartment => userDepartment.Department)))
    .ForMember(dest => dest.Companies, opt => opt.MapFrom(user => user.UsersCompanies.Select(userCompany => userCompany.Company)));


cfg.CreateMap<User,DbUser>()
    .ForMember(dest => dest.UsersDepartments, opt => opt.MapFrom( user=>user.Departments.Select( department=> new UsersDepartment{UserId=user.Id, DepartmentId=department.Id}))))
    .ForMember(dest => dest.UsersCompanies, opt => opt.MapFrom( user=>user.Companies.Select( company=> new UsersCompany{UserId=user.Id, CompanyId=company.Id}))));
公共类用户
{
...
公共列表部门{get;set;}
上市公司{get;set;}
}
公共类DbUser
{
...
公共列表用户部门{get;set;}
公共列表用户公司{get;set;}
}
cfg.CreateMap()
.FormMember(dest=>dest.Departments,opt=>opt.MapFrom(user=>user.UsersDepartments.Select(userDepartment=>userDepartment.Department)))
.ForMember(dest=>dest.companys,opt=>opt.MapFrom(user=>user.UsersCompanies.Select(userCompany=>userCompany.Company));
cfg.CreateMap()
.FormMember(dest=>dest.UsersDepartments,opt=>opt.MapFrom(user=>user.Departments.Select(department=>newusersdepartment{UserId=user.Id,DepartmentId=department.Id})))
.ForMember(dest=>dest.UsersCompanies,opt=>opt.MapFrom(user=>user.companys.Select(company=>newuserscompany{UserId=user.Id,CompanyId=company.Id}));
我还将从UsersDepartment和UsersCompany中删除附加Id,并使用组合键UsersId、DepartmentId或UseId、CompanyId


希望有帮助。

你能把
DBUser
课程也发出来吗。您的分部类也具有相同的属性?是的,很抱歉,分部类本质上是DBUser。同班同学,谢谢。我只能对配置进行一次调整。那么,如何配置映射以确保我可以映射这些对象呢?
public class User

{
...
public List<Department> Departments { get; set; }
public List<Company> Companies { get; set; }
}

public class DbUser
{
...
public List<UsersDepartment> UsersDepartments { get; set; }
public List<UsersCompany> UsersCompanies { get; set; }
}

cfg.CreateMap<UserDb, User>()
    .ForMember(dest => dest.Departments, opt => opt.MapFrom(user => user.UsersDepartments.Select(userDepartment => userDepartment.Department)))
    .ForMember(dest => dest.Companies, opt => opt.MapFrom(user => user.UsersCompanies.Select(userCompany => userCompany.Company)));


cfg.CreateMap<User,DbUser>()
    .ForMember(dest => dest.UsersDepartments, opt => opt.MapFrom( user=>user.Departments.Select( department=> new UsersDepartment{UserId=user.Id, DepartmentId=department.Id}))))
    .ForMember(dest => dest.UsersCompanies, opt => opt.MapFrom( user=>user.Companies.Select( company=> new UsersCompany{UserId=user.Id, CompanyId=company.Id}))));