2017-03-24 101 views
1

我一直試圖讓這個工作太久。我看過每個我能找到的自動映射器問題,但仍然沒有運氣。Automapper多對多

如何配置Automapper,以便它能正確映射我的業務實體和我的數據庫模型之間的許多屬性?
我正在使用DB模式使用DB第一個數據模型。

我有這些實體對象:

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 { } } 
} 

我需要能夠更新這些。我需要將它們映射到數據庫對象,以便我可以更新用戶。

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; } 
} 

我有一個方法,我傳遞實體並嘗試將其映射到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); 
    } 

這是我看到後, '地圖'(注意,沒有用戶信息被映射):

results

+0

你可以發佈'DBUser'類嗎?你的部分課程具有相同的屬性? –

+0

是的,對不起,部分類本質上是DBUser。同班。 – utd1878

回答

0

對於任何感興趣的人。我最終走了一條不同的路線,在那裏我分別更新每個集合,然後更新基本用戶類。 ...現在關閉下一期。

0

您從

public class Department{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public DateTime CreateDate { get { return DateTime.Now; } private 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; }//No matching property in Department 
    public virtual User User { get; set; }//No matching property in Department 

}

所以這是正常的馬平當DepartmentUsersDepartment

public virtual User User { get; set; }public virtual Department Department { get; set; }將爲空。

此外,您每次調用​​時都會創建一個映射器,這非常低效。請考慮,在您的應用程序開始時創建您的映射器,例如,如果它是網絡應用程序global.asax

+0

謝謝。我可以進行調整隻配置一次。那麼,如何配置地圖以確保我可以映射這些對象? – utd1878

0

如果您仍然想知道未來您的問題的可能解決方案,請執行以下代碼的必要更改以使其工作。 雖然您的DTO類用戶使用直接相關的DTO部門和公司,但您的數據庫類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})))); 

我也想刪除UsersDepartment和UsersCompany附加標識和使用組合鍵UsersId,DepartmentID的或USEID,CompanyId代替。

希望,這有助於。