【问题标题】:AutoMapper with EF Core - unchanged entity marked as changed and deleted带有 EF Core 的 AutoMapper - 未更改的实体标记为已更改并已删除
【发布时间】:2019-12-12 00:11:47
【问题描述】:

我对 EF Core 2.0 和 AutoMapper 8.1.0 的组合有一个奇怪的问题。

由于从实际代码中提取一些有意义的sn-p非常重要,我将描述结构,这很简单:

我有一个通过 EF Core Code First 映射到 DB 的数据库实体模型(仅限 POCO) - 使用 fluent API 定义。上面有一个域模型。在这两层之间有 AutoMapper 配置。当需要将更新的域对象映射到一个简单的实体时,它会利用重载

 Mapper.Map(DomainObjectInstance, EntityObjectInstance, DomainType, EntityType);

更新 EF Core 跟踪的实际 EntityObjectInstance。

它曾经工作得很好。不幸的是,模型中有一些重构,之后它停止与 EF Core 一起工作。更新域对象之一后,它正在从数据库中删除。

我发现 - 在调用 Map 方法后,DBContext 中的 ChangeTracker 检测到其中一个重要外键发生了变化 - 这是一个实体,它也包含在另一个实体的集合中(典型的 1-M 关系)。但是,如果我检查该属性,则有IsChanged = true,但实际的CurrentValueOriginalValue 是相同的。

同样有趣的是 CurrentValue == OriginalValue 返回 falseCurrentValue.Equals(OriginalValue) 返回 true 因为取消/装箱。

这种变化及其检测肯定是在Map 方法期间引起的。如果我将其注释掉,则管道可以正常工作。尽管数据没有任何实际变化,并且我将此属性的映射设置为忽略,但仍然检测到 EF Core 中的变化。如果我自己进行“手动映射”并将值从域对象分配给实体对象,问题就会消失。但是有很多领域,我想从 autoMapper 的使用中受益。

【问题讨论】:

标签: entity-framework-core automapper automapper-8


【解决方案1】:

我仍然不知道究竟出了什么问题以及为什么。但原因被困在 EF Core 和 AutoMapper 之间。 问题实际上是在重构过程中,其中一个属性被重命名了。所有设置,EF 实体模型和 AutoMapper 映射配置都进行了调整以匹配重构状态。我还尝试使用MemberList.None 选项进行所有映射配置并手动指定所有内容。可能原因是该属性的名称与其类型相同(Project)。但是像这样的其他道具可以正常工作。

但是,映射本身没有任何问题 - 它可以工作或与 EF Core 本身一起工作。但在一起它根本行不通。 (不)幸运的是,这次重命名该属性有所帮助。

在评论中 Lucian 建议使用 AutoMapper 的 EFCore 扩展 - 但它没有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-02
    • 1970-01-01
    • 2013-10-02
    相关资源
    最近更新 更多