1

以下のマッピングは機能しますが、より少ない構成で実行できるかどうか疑問に思っていました。ForAllMembersandで遊んでForSourceMemberみましたが、これまでのところうまくいくものは見つかりませんでした。

クラス

public class User
{
    [Key]
    public int ID { get; set; }

    public string LoginName { get; set; }

    public int Group { get; set; }

    ...
}

public class UserForAuthorisation
{
    public string LoginName { get; set; }

    public int Group { get; set; }
}

public class Session
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid ID { get; set; }

    public virtual User User { get; set; }

    ...
}

構成

Mapper.CreateMap<Session, UserForAuthorisation>()
    .ForMember(u => u.LoginName, m => m.MapFrom(s => s.User.LoginName))
    .ForMember(u => u.Group, m => m.MapFrom(s => s.User.Group));

クエリ

UserForAuthorisation user = this.DbContext.Sessions
    .Where(item =>
        item.ID == SessionID
        )
    .Project().To<UserForAuthorisation>()
    .Single();

編集これは逆に機能します。

Mapper.CreateMap<UserForAuthorisation, User>();

Mapper.CreateMap<UserForAuthorisation, Session>()
    .ForMember(s => s.User, m => m.MapFrom(u => u));

var source = new UserForAuthorisation()
{
    Group = 5,
    LoginName = "foo"
};
var destination = Mapper.Map<Session>(source);

残念ながら、Reverse()簡単な解決策ではありません。マッピングは機能しません。

Mapper.CreateMap<UserForAuthorisation, User>().ReverseMap();

Mapper.CreateMap<UserForAuthorisation, Session>()
    .ForMember(s => s.User, m => m.MapFrom(u => u)).ReverseMap();

var source = new Session()
{
    User = new User()
    {
        Group = 5,
        LoginName = "foo"
    }
};
var destination = Mapper.Map<UserForAuthorisation>(source);
4

1 に答える 1

1

構成を少なくするためのオプションは 1 つしかありません。クラスのプロパティの名前を次のように変更することで、お世辞の利点を利用できます。UserForAuthorisation

public class UserForAuthorisation
{
    public string UserLoginName { get; set; }
    public int UserGroup { get; set; }
}

この場合、ネストされたUserオブジェクトのプロパティは、追加の構成なしでマップされます。

Mapper.CreateMap<Session, UserForAuthorisation>();
于 2013-02-14T15:10:56.413 に答える