【问题标题】:Stop AutoMapper initializing data model properties during mapping在映射期间停止 AutoMapper 初始化数据模型属性
【发布时间】:2017-10-05 22:47:46
【问题描述】:

我有一个 ClientDocument 数据模型和映射如下:

public class ClientDocument : BaseEntity
{
    public int DocumentOwnerId { get; set; }

    public int ClientProfileId { get; set; }
    public virtual ClientProfile ClientProfile { get; set; }

    public int DocumentId { get; set; }
    public virtual Document Document { get; set; }
}

public ClientDocumentMap(EntityTypeBuilder<ClientDocument> entityBuilder)
        {
            entityBuilder.HasKey(t => t.Id);

            // One to Many with client profile
            entityBuilder.HasOne(c => c.ClientProfile).WithMany(p => p.ClientDocuments).HasForeignKey(x => x.ClientProfileId).IsRequired();

            // One to Many with document
            entityBuilder.HasOne(c => c.Document).WithMany(p => p.ClientDocuments).HasForeignKey(x => x.DocumentId).IsRequired();
        }

和一个 ClientDocumentViewModel 如下:

public class ClientDocumentViewModel
{
        public int Id { get; set; }

        public int CreatedBy { get; set; }

        public DateTime AddedDate { get; set; }

        [HiddenInput]
        public int ClientProfileId { get; set; }

        public string ClientProfileName { get; set; }

        public int SecondaryClientProfileId { get; set; }

        [HiddenInput]
        public string SecondaryClientProfileName { get; set; }

        public int DocumentOwnerId { get; set; }

        public int DocumentId { get; set; }

        public DocumentViewModel Document { get; set; }
    }

当我将 ClientDocumentViewModel 传递给映射器并使用以下方法将视图模型映射到数据模型时:

var entity = _mapper.Map<ClientDocumentViewModel, ClientDocument>(model);

来自 ViewModel 的属性都正确地映射到数据模型,但是映射器也在初始化 ClientProfile 的一个实例,该实例正在使用实体框架停止插入。

我有其他使用相同映射模式的数据模型和视图模型。当我调试它们时,ClientProfile 属性没有被初始化并且数据实体被成功插入。我浏览并比较了数据模型、实体框架映射、数据库上的外键和映射配置文件,它们看起来都一样。

有人知道为什么会这样吗?

【问题讨论】:

  • 见this。
  • 谢谢。前几天我确实更新了我的自动映射器依赖注入版本,这就解释了为什么会出现这种行为。
  • 你是如何定义映射的?
  • 在 Lucian 的链接之前,我声明了一次映射,然后使用 ReverseMap。我需要非扁平化行为,因此必须声明映射两次。
  • 嗯,正是 unflattening 导致了这种行为。

标签: c# entity-framework automapper automapper-6


【解决方案1】:

您可以指定 ClientProfile 以忽略映射配置文件中的属性,如下所示:

CreateMap<ClientDocumentViewModel, ClientDocument>()
     .ForMember(x => x.ClientProfile, src => src.Ignore());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-16
    • 1970-01-01
    • 1970-01-01
    • 2020-01-25
    相关资源
    最近更新 更多