1

私は MVC と自動マッパーから始めています。いくつかのガイダンスをいただければ幸いです。いくつかのドメイン モデルと、これらのドメイン モデルを組み合わせたビュー モデルがあります。クラスは基本的に4クラス

Transcriptionユーザー ID を持つAudioが所有する関連付けられた を持っていますClient StaffUsers

データベース関係図:

http://i49.tinypic.com/whcwsz.jpg

生成されたドメイン モデル EF (関連するフィールドのみ)

public class audio
{
    public int AudioID { get; set; }
    public string AudioLength { get; set; }
    public virtual ClientStaff ClientStaff { get; set; }
    public virtual ICollection<Transcription> Transcriptions { get; set; }
}

public class ClientStaff
{
    public int ClientStaffID { get; set; }
    public int StaffType { get; set; }
    public int ClientID { get; set; }
    public virtual ICollection<Audio> Audios { get; set; }
    public virtual User User { get; set; }
}

public class User
{
    public int UserID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }    
    public virtual ICollection<ClientStaff> ClientStaffs { get; set; }
}

public class Transcription
{
    public int TranscriptionID { get; set; }
    public string TranscriptionText { get; set; }
    public virtual Audio Audio { get; set; }
    public Nullable<int> AudioID { get; set; }
}

モデルを見る

public class customVM
{
    public int AudioID { get; set; }//get from audio
    public string Path { get; set; }//get from audio
    public string AudioLength { get; set; }//get from audio
    public DateTime AudioCreatedOn { get; set; }//get from audio
    public int ClientStaffID { get; set; }//get from audio
    public string TranscriptionText { get; set; }//get from transcription
    public DateTime TranscriptionCreatedOn { get; set; }//get from transcription
    public string UsersFirstName { get; set; }//get from users
    public string UsersLastName { get; set; }//get from users 
}

コントローラーのアクション

public ActionResult Index()
{
    IEnumerable<Audio> x= db.getAudioFiles();
    Mapper.CreateMap<Audio, customVM>();
    IEnumerable<customVM> model =
        Mapper.Map<IEnumerable<Audio>, IEnumerable<customVM>>(x);
    Mapper.AssertConfigurationIsValid();

    return View(model);
}

問題 :

AutoMapperTranscriptionandからプロパティClientStaffを取得していますが、ユーザーの姓と名を取得するにはどうすればよいですか? または、自動マッパーを使用して第 2 レベルのネストされたクラス プロパティを取得する方法を一般化します。それとも、問題全体に間違ってアプローチしていますか?

4

1 に答える 1

2

明示的に定義する必要があります。例えば:

Mapper.CreateMap<Audio, customVM>()
    .ForMember(dest => dest.UsersFirstName,
               opt => opt.MapFrom(src => src.ClientStaff.User.FirstName))
    .ForMember(dest => dest.UsersLastName,
               opt => opt.MapFrom(src => src.ClientStaff.User.LastName));

IEnumerableまた、テストしていませんが、マップで指定する必要はないと思います。つまり、これはうまくいくはずだと言われました:

IEnumerable<customVM> model= Mapper.Map<Audio, customVM>(x);

それほど重要ではありませんが、コードを少しクリーンアップします。

余談ですが、アクションにマッピング構成を含める代わりに、マッピングを一度だけ構成する必要があります。これを行う最善の方法は、プロファイルを使用することです。

public class MyProfile : Profile
{
    public override string ProfileName
    {
        get
        {
            return "MyProfile";
        }
    }

    protected override void Configure()
    {
        AutoMapper.Mapper.CreateMap<Audio, customVM>()
            .ForMember(dest => dest.UsersFirstName,
                       opt => opt.MapFrom(src => src.ClientStaff.User.FirstName))
            .ForMember(dest => dest.UsersLastName,
                       opt => opt.MapFrom(src => src.ClientStaff.User.LastName));
    }
}

これは、初期化メソッド ( App_StartWeb プロジェクトなど) で初期化する必要があります。

マッピングが正しく構成されていることをテストする単体テストも作成する必要があります。

[TestFixture]
public class MappingTests
{
    [Test]
    public void AutoMapper_Configuration_IsValid()
    {
        Mapper.Initialize(m => m.AddProfile<MyProfile>());
        Mapper.AssertConfigurationIsValid();
    }
}

コントローラーのアクションは次のようになります。

public ActionResult Index()
{
    IEnumerable<Audio> x= db.getAudioFiles();
    IEnumerable<customVM> model =
        Mapper.Map<IEnumerable<Audio>, IEnumerable<customVM>>(x);
    return View(model);
}
于 2012-12-19T10:48:23.547 に答える