2017-11-13 8 views
0
ImはAutofacとAutomapperを使用して

、私は次のようしているドメインクラス:Automapper問題は、プロファイルの

次のプロファイルを使用して

public class AlumnoModel 
{ 
    #region Fields 
    public int Id { get; set; } 
    public string Nombre { get; set; } 
    public string Apellido { get; set; } 
    public string Legajo { get; set; } 
    public int Dni { get; set; } 
    public TurnoModel Turno { get; set; } 
    public CarreraModel Carrera { get; set; } 
    #endregion 
} 

public class CarreraModel 
{ 
    #region Fields 
    public int Id { get; set; } 
    public string Descripcion { get; set; } 
    #endregion 
} 

public class TurnoModel 
{ 
    #region Fields 
    public int Id { get; set; } 
    public string Descripcion { get; set; } 
    #endregion 
} 

とIM:

public partial class Alumnos 
{ 
    public int Id { get; set; } 

    [Required] 
    [StringLength(50)] 
    public string Nombre { get; set; } 

    [Required] 
    [StringLength(50)] 
    public string Apellido { get; set; } 

    [Required] 
    [StringLength(50)] 

    public string Legajo { get; set; } 

    public int Dni { get; set; } 

    public int Carrera { get; set; } 

    public int Turno { get; set; } 

    public virtual Carreras Carreras { get; set; } 

    public virtual Turnos Turnos { get; set; } 
} 

public partial class Carreras 
{ 
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")] 
    public Carreras() 
    { 
     Alumnos = new HashSet<Alumnos>(); 
    } 

    public int Id { get; set; } 

    [Required] 
    [StringLength(50)] 
    public string Descripcion { get; set; } 

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] 
    public virtual ICollection<Alumnos> Alumnos { get; set; } 
} 

public partial class Turnos 
{ 
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")] 
    public Turnos() 
    { 
     Alumnos = new HashSet<Alumnos>(); 
    } 

    public int Id { get; set; } 

    [Required] 
    [StringLength(50)] 
    public string Descripcion { get; set; } 

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] 
    public virtual ICollection<Alumnos> Alumnos { get; set; } 
} 

そして、これは私のモデルです

public class AlumnoProfile : Profile 
    { 
     public AlumnoProfile() 
     { 
      CreateMap<Alumnos, AlumnoModel>() 
       .ForMember(d => d.Nombre, s => s.MapFrom(src => src.Nombre)) 
       .ForMember(d => d.Apellido, s => s.MapFrom(src => src.Apellido)) 
       .ForMember(d => d.Legajo, s => s.MapFrom(src => src.Legajo)) 
       .ForMember(d => d.Dni, s => s.MapFrom(src => src.Dni)) 

       .ForMember(d => d.Turno, s => s.MapFrom(src => src.Turnos)) 
       .ForMember(d => d.Carrera, s => s.MapFrom(src => src.Carreras)); 

      CreateMap<AlumnoModel, Alumnos>() 
       .ForMember(d => d.Id, s => s.Ignore()) 
       .ForMember(d => d.Nombre, s => s.MapFrom(src => src.Nombre)) 
       .ForMember(d => d.Apellido, s => s.MapFrom(src => src.Apellido)) 
       .ForMember(d => d.Legajo, s => s.MapFrom(src => src.Legajo)) 
       .ForMember(d => d.Dni, s => s.MapFrom(src => src.Dni)) 

       .ForMember(d => d.Carrera, s => s.MapFrom(src => src.Carrera.Id)) 
       .ForMember(d => d.Turno, s => s.MapFrom(src => src.Turno.Id)); 

     } 
    } 

public class CarreraProfile : Profile 
{ 
    public CarreraProfile() 
    { 
     CreateMap<Carreras, CarreraModel>() 
      .ForMember(d => d.Id, s => s.MapFrom(src => src.Id)) 
      .ForMember(d => d.Descripcion, s => s.MapFrom(src => src.Descripcion)) 
      .ForAllOtherMembers(d => d.Ignore()); 

     CreateMap<CarreraModel, Carreras>() 
      .ForMember(d => d.Id, s => s.MapFrom(src => src.Id)) 
      .ForAllOtherMembers(opts => opts.Ignore()); 

    } 
} 

public class TurnoProfile : Profile 
{ 
    public TurnoProfile() 
    { 
     CreateMap<TurnoModel, Turnos>() 
      .ForMember(d => d.Id, s => s.MapFrom(src => src.Id)) 
      .ForAllOtherMembers(d => d.Ignore()); 

     CreateMap<Turnos, TurnoModel>() 
      .ForMember(d => d.Id, s => s.MapFrom(src => src.Id)) 
      .ForMember(d => d.Descripcion, s => s.MapFrom(src => src.Descripcion)) 
      .ForAllOtherMembers(d => d.Ignore()); 



    } 
} 

これは私がオートファックを使用している方法です:

builder.RegisterAssemblyTypes().AssignableTo(typeof(Profile)); 

      builder.Register(c => new MapperConfiguration 
      (cfg => 
      { 
       foreach (var profile in c.Resolve<IEnumerable<Profile>>()) 
       { 
        cfg.AddProfile(profile); 
       } 
      } 
      )).AsSelf().SingleInstance(); 

      builder.Register(c => c.Resolve<MapperConfiguration>().CreateMapper(c.Resolve)).As<IMapper>().InstancePerLifetimeScope(); 

とIM持つとイムは、ドメインクラスにモデルからマッピングしようとしている問題は

Unmapped members were found. Review the types and members below. 
Add a custom mapping expression, ignore, add a custom resolver, or modify the source/destination type 
For no matching constructor, add a no-arg ctor, add optional arguments, or map all of the constructor parameters 
============================================================== 
AlumnoModel -> Alumnos (Destination member list) 
Prog_II.Data.Model.AlumnoModel -> Prog_II.Data.Domain.Alumnos (Destination member list) 

Unmapped properties: 
Carreras 
Turnos 

私はMemberlist.Sourceを使用してみました(データを保存)し、私がした各プロパティの:

.ForSourceMember(d => d.property, opt => opt.Ignore()) 

私は使ってみました.ForAllOtherMembers(opt => opt.Ignore())

私がMapper.Mapを呼び出すのは、他の2つのモデルのマップです。たとえば、マップしたい場合はから:

public Alumnos FromModelToDomain_Alumnos(AlumnoModel alumno) 
    { 
     return _Mapper.Map<Alumnos>(alumno); 
    } 

が、私は次の行を追加する必要が動作するために:

public Alumnos FromModelToDomain_Alumnos(AlumnoModel alumno) 
{ 
    FromModelToDomain_Turno(alumno.Turno); 
    FromModelToDomain_Carrera(alumno.Carrera); 
    return _Mapper.Map<Alumnos>(alumno); 
} 

public Turnos FromModelToDomain_Turno(TurnoModel turno) 
{ 
    return _Mapper.Map<Turnos>(turno); 
} 

public Carreras FromModelToDomain_Carrera(CarreraModel carrera) 
{ 
    return _Mapper.Map<Carreras>(carrera); 
} 

私はそれらをマッピングするために持っているように理にかなっています。 、

Unmapped members were found. Review the types and members below. 
Add a custom mapping expression, ignore, add a custom resolver, or modify the source/destination type 
For no matching constructor, add a no-arg ctor, add optional arguments, or map all of the constructor parameters 
============================================================ 
TurnoModel -> Turnos (Destination member list) 
Prog_II.Data.Model.TurnoModel -> Prog_II.Data.Domain.Turnos (Destination member list) 

Unmapped properties: 
Alumnos 

そしてTurnosAlumnos(ドメインクラス)のHashSetのを持っているので、これは、テーブル間の1からnの関係(EF 5)の起こる:私はこれを行うと

は、これは、1つの以上のエラーがスローされます私は私のモデルでそれを持っていないので、私はこのプロパティが無視されたい。

答えて

0

あなたのマッピング設定はちょっと奇妙に見えます。名前が一致しているが、他のすべては無視している単一のプロパティに対して明示的なマッピングを行っていますか? AutoMapperは「これらの2つのプロパティを実行するだけですが、それ以外は何もしません」と言うと、AutoMapperを使用するのはなぜですか?

は、それはあなたが逆のマッピングをチェックアウトする場合がありますようになります:あなたが達成しようとしているものに近いかもしれ

http://docs.automapper.org/en/stable/Reverse-Mapping-and-Unflattening.html

。無視とは、このフィールドをマップしないことを意味します。私はあなたが望むとは思わないでしょうか?

関連する問題