2016-09-12 3 views
0

У меня есть приложение EF6 MVC с использованием кода First для генерации моделей. Я пытаюсь создать сопоставление с использованием AutoMapper между моделью и представлением viewmodel этой модели.AutoMapper с EF6, не заполняющим один из отображаемых объектов

У меня нет ошибок, но в результирующем объекте отсутствуют детали для объекта PTCredential. В частности, мне не хватает объекта PTCredential, который вложен в PTCredential. Я не верю, что Игнорирование вызывает это, но я не могу его закрепить. Я пробовал некоторые предложения из других сообщений в AutoMapper, но ничего не оказалось полезным.

Может ли кто-нибудь помочь в том, что я могу сделать, чтобы успешно использовать AutoMapper в этой ситуации?

Вот код, как я настройке и инициализации Mapper:

var pTConnections = _db.PTConnections.Include(p => p.PTConnectionClass).ToList(); 

     Mapper.Initialize(cfg => 
     { 
      cfg.CreateMap<PTConnection, PTConnectionViewModel>() 
       .AfterMap((s, d) => { foreach (var i in d.PTCredentialAssignments) i.PTConnection = d; }); 

      cfg.CreateMap<PTCredentialAssignment, PTCredentialAssignmentViewModel>() 
       .ForMember(m => m.PTCredential, opt => opt.Ignore()) 
       .ForMember(m => m.PTConnection, opt => opt.Ignore()); 

      cfg.CreateMap<PTVendor, PTVendorViewModel>() 
       .ForMember(m => m.PTCredentials, opt => opt.Ignore()) 
       .ForMember(m => m.PTConnections, opt => opt.Ignore()); 

      cfg.CreateMap<PTCredential, PTCredentialViewModel>(); 

      cfg.CreateMap<PTConnectionClass, PTConnectionClassViewModel>() 
       .ForMember(m => m.PTConnections, opt => opt.Ignore()); 

      cfg.CreateMap<PTConnectionContactAssignment, PTConnectionContactAssignmentViewModel>() 
       .ForMember(m => m.PTConnection, opt => opt.Ignore()); 

     }); 

    var dest = Mapper.Map<List<PTConnection>, List<PTConnectionViewModel>>(pTConnections); 

Вот мой код Первая модель:

public partial class PTConnection 
{ 
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")] 
    public PTConnection() 
    { 
     PTConnectionAssignments = new HashSet<PTConnectionAssignment>(); 
     PTCredentialAssignments = new HashSet<PTCredentialAssignment>(); 
     PTConnectionContactAssignments = new HashSet<PTConnectionContactAssignment>(); 
    } 

    [Key] 
    public int PTCID { get; set; } 

    [Column(TypeName = "datetime2")] 
    public DateTime ModifiedDate { get; set; } 

    [Required] 
    [StringLength(500)] 
    public string ModifiedBy { get; set; } 

    [Required] 
    [StringLength(255)] 
    public string ConnectionName { get; set; } 

    [Required] 
    [StringLength(100)] 
    public string Host { get; set; } 

    public int Port { get; set; } 

    public string Comment { get; set; } 

    public int PTCCID { get; set; } 

    public bool? IsDisabled { get; set; } 

    public int PTVID { get; set; } 

    public virtual PTConnectionClass PTConnectionClass { get; set; } 

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

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

    public virtual PTVendor PTVendor { get; set; } 

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

public partial class PTCredential 
{ 
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")] 
    public PTCredential() 
    { 
     PTCredentialAssignments = new HashSet<PTCredentialAssignment>(); 
     PTCredentialContactAssignments = new HashSet<PTCredentialContactAssignment>(); 
    } 

    [Key] 
    public int PTCRID { get; set; } 

    [Column(TypeName = "datetime2")] 
    public DateTime ModifiedDate { get; set; } 

    [Required] 
    [StringLength(500)] 
    public string ModifiedBy { get; set; } 

    [Required] 
    [StringLength(100)] 
    public string CredUsername { get; set; } 

    [Required] 
    [StringLength(500)] 
    public string CredPassword { get; set; } 

    public string Directory { get; set; } 

    public bool? IsDisabled { get; set; } 

    public string Comments { get; set; } 

    public int? PTVID { get; set; } 

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

    public virtual PTVendor PTVendor { get; set; } 

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

public partial class PTVendor 
{ 
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")] 
    public PTVendor() 
    { 
     PTConnections = new HashSet<PTConnection>(); 
     PTCredentials = new HashSet<PTCredential>(); 
     PTIneligableCredentialVendorAssignments = new HashSet<PTIneligableCredentialVendorAssignment>(); 
     PTVendorAssignments = new HashSet<PTVendorAssignment>(); 
     PTVendorContactAssignments = new HashSet<PTVendorContactAssignment>(); 
    } 

    [Key] 
    public int PTVID { get; set; } 

    [Column(TypeName = "datetime2")] 
    public DateTime ModifiedDate { get; set; } 

    [Required] 
    [StringLength(500)] 
    public string ModifiedBy { get; set; } 

    [Required] 
    [StringLength(50), Display(Name="Vendor Name")] 
    public string Name { get; set; } 

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

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

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

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

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

[Table("PTCredentialAssignment")] 
public partial class PTCredentialAssignment 
{ 
    [Key] 
    public int PTCRAID { get; set; } 

    [Column(TypeName = "datetime2")] 
    public DateTime ModifiedDate { get; set; } 

    [Required] 
    [StringLength(500)] 
    public string ModifiedBy { get; set; } 

    public int PTCID { get; set; } 

    public int PTCRID { get; set; } 

    public virtual PTConnection PTConnection { get; set; } 

    public virtual PTCredential PTCredential { get; set; } 
} 

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

    [Key] 
    public int PTCCID { get; set; } 

    [Column(TypeName = "datetime2")] 
    public DateTime ModifiedDate { get; set; } 

    [Required] 
    [StringLength(500)] 
    public string ModifiedBy { get; set; } 

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

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

[Table("PTConnectionContactAssignment")] 
public partial class PTConnectionContactAssignment 
{ 
    [Key] 
    public int PTCCAID { get; set; } 

    [Column(TypeName = "datetime2")] 
    public DateTime ModifiedDate { get; set; } 

    [Required] 
    [StringLength(500)] 
    public string ModifiedBy { get; set; } 

    public int PTCID { get; set; } 

    [Required] 
    [StringLength(60)] 
    public string FirstName { get; set; } 

    [Required] 
    [StringLength(60)] 
    public string LastName { get; set; } 

    [Required] 
    [StringLength(10)] 
    public string PhoneNumber { get; set; } 

    [StringLength(20)] 
    public string Extension { get; set; } 

    [StringLength(100)] 
    public string Email { get; set; } 

    [StringLength(60)] 
    public string Title { get; set; } 

    public string Comment { get; set; } 

    public virtual PTConnection PTConnection { get; set; } 
} 

Вот мой ViewModel:

public partial class PTConnectionViewModel 
    { 
     [Key] 
     public int PTCID { get; set; } 

     [Column(TypeName = "datetime2")] 
     public DateTime ModifiedDate { get; set; } 

     [Required] 
     [StringLength(500)] 
     public string ModifiedBy { get; set; } 

     [Required] 
     [StringLength(255)] 
     public string ConnectionName { get; set; } 

     [Required] 
     [StringLength(100)] 
     public string Host { get; set; } 

     public int Port { get; set; } 

     public string Comment { get; set; } 

     public int PTCCID { get; set; } 

     public bool? IsDisabled { get; set; } 

     public int PTVID { get; set; } 

     public virtual PTConnectionClassViewModel PTConnectionClass { get; set; } 

     public virtual ICollection<PTConnectionAssignmentViewModel> PTConnectionAssignments { get; set; } 

     public virtual ICollection<PTCredentialAssignmentViewModel> PTCredentialAssignments { get; set; } 

     public virtual PTVendorViewModel PTVendor { get; set; } 

     public virtual ICollection<PTConnectionContactAssignmentViewModel> PTConnectionContactAssignments { get; set; } 
    } 

public partial class PTVendorViewModel 
{ 
    [Key] 
    public int PTVID { get; set; } 

    [Column(TypeName = "datetime2")] 
    public DateTime ModifiedDate { get; set; } 

    [Required] 
    [StringLength(500)] 
    public string ModifiedBy { get; set; } 

    [Required] 
    [StringLength(50), Display(Name="Vendor Name")] 
    public string Name { get; set; } 

    public virtual ICollection<PTConnectionViewModel> PTConnections { get; set; } 

    public virtual ICollection<PTCredentialViewModel> PTCredentials { get; set; } 

} 

public partial class PTCredentialViewModel 
{ 
    [Key] 
    public int PTCRID { get; set; } 

    [Column(TypeName = "datetime2")] 
    public DateTime ModifiedDate { get; set; } 

    [Required] 
    [StringLength(500)] 
    public string ModifiedBy { get; set; } 

    [Required] 
    [StringLength(100)] 
    public string CredUsername { get; set; } 

    [Required] 
    [StringLength(500)] 
    public string CredPassword { get; set; } 

    public string Directory { get; set; } 

    public bool? IsDisabled { get; set; } 

    public string Comments { get; set; } 

    public int? PTVID { get; set; } 

    public virtual ICollection<PTCredentialAssignmentViewModel> PTCredentialAssignments { get; set; } 

    public virtual PTVendorViewModel PTVendor { get; set; } 

    public virtual ICollection<PTCredentialContactAssignmentViewModel> PTCredentialContactAssignments { get; set; } 
} 

public partial class PTCredentialAssignmentViewModel 
{ 
    [Key] 
    public int PTCRAID { get; set; } 

    [Column(TypeName = "datetime2")] 
    public DateTime ModifiedDate { get; set; } 

    [Required] 
    [StringLength(500)] 
    public string ModifiedBy { get; set; } 

    public int PTCID { get; set; } 

    public int PTCRID { get; set; } 

    public virtual PTConnectionViewModel PTConnection { get; set; } 

    public virtual PTCredentialViewModel PTCredential { get; set; } 
} 

public partial class PTConnectionClassViewModel 
{ 

    [Key] 
    public int PTCCID { get; set; } 

    [Column(TypeName = "datetime2")] 
    public DateTime ModifiedDate { get; set; } 

    [Required] 
    [StringLength(500)] 
    public string ModifiedBy { get; set; } 

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

    public virtual ICollection<PTConnectionViewModel> PTConnections { get; set; } 
} 

public partial class PTConnectionContactAssignmentViewModel 
{ 
    [Key] 
    public int PTCCAID { get; set; } 

    [Column(TypeName = "datetime2")] 
    public DateTime ModifiedDate { get; set; } 

    [Required] 
    [StringLength(500)] 
    public string ModifiedBy { get; set; } 

    public int PTCID { get; set; } 

    [Required] 
    [StringLength(60)] 
    public string FirstName { get; set; } 

    [Required] 
    [StringLength(60)] 
    public string LastName { get; set; } 

    [Required] 
    [StringLength(10)] 
    public string PhoneNumber { get; set; } 

    [StringLength(20)] 
    public string Extension { get; set; } 

    [StringLength(100)] 
    public string Email { get; set; } 

    [StringLength(60)] 
    public string Title { get; set; } 

    public string Comment { get; set; } 

    public virtual PTConnectionViewModel PTConnection { get; set; } 
} 
+0

Я не знаком с automapper ... однако, где вы включаете свойство навигации? с обычными вызовами DbSet это свойство должно быть нулевым, пока не будет перечислено, или соответствующий объект уже находится в контексте. – DevilSuichiro

+0

«В частности, я пропускаю объект PTCredential, который вложен в PTCredential» - это опечатка? Если вам не хватает его из PTCredentialAssignmentViewModel, тогда да, вы говорите ему, чтобы игнорировать это. –

+0

@ Steve-Greene Спасибо за ваше предложение, иногда вы не можете увидеть лес через деревья, и вот что здесь произошло. Мне показалось, что я прошел через мою модель данных так хорошо, как только разместил, но, когда вы указали мою опечатку, я вернулся и смог увидеть, чего не хватает. Я заметил, что одним из моих других объектов было сопоставление, заставляя меня делать правильное сопоставление и получать правильный объект. Спасибо за вашу помощь! – silverbullettruck2001

ответ

0

Вот картинка, которая сделала мое решение:

 cfg.CreateMap<PTConnection, PTConnectionViewModel>() 
      .AfterMap((s, d) => { foreach (var i in d.PTCredentialAssignments) i.PTConnection = d; }); 

     cfg.CreateMap<PTCredentialAssignment, PTCredentialAssignmentViewModel>() 
      .ForMember(m => m.PTConnection, opt => opt.Ignore()); 

     cfg.CreateMap<PTVendor, PTVendorViewModel>() 
      .ForMember(m => m.PTCredentials, opt => opt.Ignore()) 
      .ForMember(m => m.PTConnections, opt => opt.Ignore()); 

     cfg.CreateMap<PTCredential, PTCredentialViewModel>() 
      .ForMember(m => m.PTCredentialAssignments, opt => opt.Ignore()) 
      .ForMember(m => m.PTCredentialContactAssignments, opt => opt.Ignore()); 

     cfg.CreateMap<PTConnectionClass, PTConnectionClassViewModel>() 
      .ForMember(m => m.PTConnections, opt => opt.Ignore()); 

     cfg.CreateMap<PTConnectionContactAssignment, PTConnectionContactAssignmentViewModel>() 
      .ForMember(m => m.PTConnection, opt => opt.Ignore()); 

 Смежные вопросы

  • Нет связанных вопросов^_^