【问题标题】:AutoMapper with EF6 not populating one of the mapped objects带有 EF6 的 AutoMapper 未填充映射对象之一
【发布时间】:2016-09-12 19:33:40
【问题描述】:

我有一个使用 Code First 生成模型的 EF6 MVC 应用程序。我正在尝试使用 AutoMapper 在模型和该模型的视图模型表示之间创建映射。

我没有错误,但生成的对象缺少 PTCredential 对象的详细信息。具体来说,我缺少嵌套在 PTCredential 中的 PTCredential 对象。 我不相信 Ignores 造成了这种情况,但我无法确定。我已经尝试了 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; }
}

【问题讨论】:

  • 我不熟悉自动映射器...但是,您在哪里包含导航属性?对于普通的 DbSet 调用,此属性应为 null,直到枚举或相应的实体已在上下文中。
  • “特别是我缺少嵌套在 PTCredential 中的 PTCredential 对象”——这是一个错字吗?如果您从 PTCredentialAssignmentViewModel 中遗漏了它,那么是的,您是在告诉它忽略它。
  • @Steve-Greene 感谢您的建议,有时您无法透过树木看到森林,这就是这里发生的情况。在我发布之前,我以为我已经很好地完成了我的数据模型,但是当你指出我的错字时,我又回去了,能够看到我遗漏了什么。我注意到我的其他对象之一是映射使我无法进行正确的映射并获得正确的对象。感谢您的帮助!

标签: entity-framework automapper dto


【解决方案1】:

这是使我的解决方案起作用的映射:

       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());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-23
    • 2012-10-16
    • 1970-01-01
    • 2019-03-30
    • 2017-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多