2017-03-24 13 views
1

私はこれを長時間にわたって稼働させようとしてきました。私は見つけることができたすべてのオートマッパの質問を見てきましたが、まだ運がありません。Automapper多対多

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モデルにマップする方法があります。これはオートマトンに私のジョインテーブルを丁寧にマップさせるための約100回の試行の後、私が今持っていることです。

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 

}

ので、→UsersDepartmentDepartment

public virtual User User { get; set; }public virtual Department Department { get; set; }をmaping場合はヌルになること正常です。

さらに、​​を呼び出すたびにマッパーを作成していますが、これは非常に非効率的です。あなたのアプリケーションの冒頭にマッパーを作成してみてください。たとえば、ウェブアプリケーションの場合はglobal.asaxなど

+0

ありがとうございます。私は調整を1回だけ行うことができます。それで、これらのオブジェクトをマップできるようにマップを構成するにはどうすればよいですか? – 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、代わりたCompanyIdをUsersDepartmentとUsersCompanyから追加のIDを削除して使用します。

希望、それは役立ちます。