automapper - 如果源属性不同,只能写入目标属性的最简单选项?

时间:2011-02-23 13:53:54

标签: automapper

注意:该场景使用2个实体框架模型来同步2个数据库之间的数据,但我认为这适用于其他场景。也可以尝试在EF端解决这个问题(比如this SO question),但我想看看AutoMapper是否可以开箱即用

我正在试图弄清楚AutoMapper是否可以(轻松地)比较源和目标值(当使用它来同步到现有对象时)并且仅在值不同时执行复制(默认情况下基于等于,可能传入一个Func,就好像我决定用StringComparison.OrdinalIgnoreCase为一些特定的值做String.Equals)。至少对于我的场景,我很好,如果仅限于TSource == TDest情况(我将同步int,字符串等,所以我认为我不需要任何类型转换器)< / p>

查看示例和测试,最接近的事情似乎是条件映射(src \ UnitTests \ ConditionalMapping.cs),我会使用带有Func的Condition重载(因为其他重载是不够的,因为我们也需要dest信息)。这肯定看起来就像它可以正常工作(我还没有实际使用它),但我最终会为每个成员指定这个(虽然我猜我可以定义少量的动作/方法和至少重复使用它们而不是使用N个不同的lambdas。)

这是最简单的可用路径(在更改AutoMapper之外),如果源和目标值不同,则获取“仅复制”或者是否有其他方式我没有看到?如果 是最简单的路线,那么在其他地方之前是否已经完成了这项工作?当然,我觉得我很可能在这里重新发明轮子。 :)

1 个答案:

答案 0 :(得分:0)

Chuck Norris(以前称为Omu?:)已经回答了这个问题,但是通过评论,所以只是回答并接受重复他说的话。

  

@James Manning你必须继承ConventionInjection,覆盖   匹配方法并写入返回c.SourceProp.Name =   c.TargetProp.Name&amp;&amp; c.SourceProp.Value!= c.TargetProp.Value和   使用后它target.InjectFrom(source);

在我的特殊情况下,由于我还有其他一些需求,我只是定制了EF4代码生成,以包括检查新值是否与当前值(对于标量)相同做一个'条件'副本的问题 - 现在我可以使用Automapper或ValueInject或任何原样。 :)

对于任何对此更改感兴趣的人,当您获得默认的* .tt文件时,进行此更改的最简单方法(至少我可以告诉)是找到2行,如:

if (ef.IsKey(primitiveProperty))

并将两者都改为:

if (ef.IsKey(primitiveProperty) || true) // we always want the setter to include checking for the target value already being set