2017-03-24 1 views
1

나는 이것을 오랫동안 사용하려고 노력해 왔습니다. 내가 찾을 수있는 모든 자동 검색 질문을 살펴 보았지만 여전히 운이 없다.Automapper Many to Many

Automapper를 비즈니스 엔티티와 데이터베이스 모델간에 여러 속성을 올바르게 매핑하도록 구성하는 방법은 무엇입니까?
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 { } } 
} 

내가이를 업데이트 할 수 있어야합니다. 사용자를 업데이트 할 수 있도록 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; } 
} 

필자는 엔티티를 전달하고이를 db 모델에 매핑하는 방법을 사용합니다. 이것은 automapper가 정중하게 나의 조인 테이블을 매핑하게하는 약 100 가지의 다른 시도 후에 내가 지금 가지고있는 것입니다 ... 운이 없다.

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

에서 매핑됩니다

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

내가이 '지도'(사용자 정보가 매핑되지 않은 통지) 후 무엇을보고있다
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 

}

은 그래서 UsersDepartment

public virtual User User { get; set; }public virtual Department Department { get; set; }Department을 maping 때하는 null이 될 것 정상입니다.

또한 private DBUser ToDataModel(User user)을 호출 할 때마다 매퍼를 생성하므로 매우 비효율적입니다. 응용 프로그램 시작시 매퍼를 작성하십시오 (예 : 웹 응용 프로그램 인 경우 global.asax 등).

+0

감사. 설정을 한 번만 할 수 있습니다. 맵을 구성하여 맵핑 할 수 있도록하려면 어떻게해야합니까? – utd1878

0

향후 문제에 대한 가능한 해결책을 알고 싶다면 코드를 수정하려면 다음과 같이하십시오. DTO 클래스 사용자가 직접 관련 DTO 부서 및 회사를 사용하는 동안 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})))); 

또한 결합 된 키 UsersId, DepartmentId 또는 UseId, 대신에 회사 ID를 UsersDepartment 및 UsersCompany에서 추가 ID를 제거하고 사용합니다.

희망, 도움이됩니다.