2011-04-25 20 views
10

使用AutoMapper,是否可以僅將已更改的屬性從視圖模型映射到域對象?僅地圖改變了屬性?

我遇到的問題是,如果視圖模型上的屬性未更改(空),則它們將覆蓋域對象並持久保存到數據庫。

回答

13

是的,它可以完成,但您必須在映射配置中指定何時使用Condition()跳過目標屬性。

下面是一個例子。考慮下面的類:

public class Source 
{ 
    public string Text { get; set; } 
    public bool Map { get; set; } 
} 

public class Destination 
{ 
    public string Text { get; set; } 
} 

的第一張地圖將不會覆蓋destination.Text,但第二意願。

Mapper.CreateMap<Source, Destination>() 
      .ForMember(dest => dest.Text, opt => opt.Condition(src => src.Map)); 

var source = new Source { Text = "Do not map", Map = false }; 
var destination = new Destination { Text = "Leave me alone" }; 
Mapper.Map(source, destination); 
source.Map = true; 
var destination2 = new Destination { Text = "I'll be overwritten" }; 
Mapper.Map(source, destination2); 
0

編號

這正是您從未將視圖模型映射到域模型的原因之一。域/業務模型的變化對於工具來說太重要了。


手動:

customer.LastName = viewModel.LastName 

不斷變化的業務狀態是不這樣做太重要了。

+4

什麼?我認爲這正是這是什麼?請詳細說明如何將您的域對象轉換爲您的視圖模型。 – Sam 2011-04-25 18:43:15

+0

我在上面的意思是如何讓你的編輯/視圖模型回到你的域對象? – Sam 2011-04-25 18:52:10

+0

你是否在你的控制器中執行此操作? – Sam 2011-04-25 23:40:31

3

是;我編寫了這個擴展方法來將髒模型中的髒值映射到實體框架。

public static IMappingExpression<TSource, TDestination> MapOnlyIfDirty<TSource, TDestination>(
    this IMappingExpression<TSource, TDestination> map) 
{ 
    map.ForAllMembers(source => 
    { 
     source.Condition(resolutionContext => 
     { 
      if (resolutionContext.SourceValue == null) 
       return !(resolutionContext.DestinationValue == null); 
      return !resolutionContext.SourceValue.Equals(resolutionContext.DestinationValue); 
     }); 
    }); 
    return map; 
} 

例子:

Mapper.CreateMap<Model, Domain>().MapOnlyIfDirty(); 
+1

SourceValue不是resolutioncontext的可用成員。我錯過了什麼? – CrusherJoe 2016-09-07 06:24:08

+0

是的,這些成員「SourceValue」和「DestinationValue」也不適用於我。 – JARRRRG 2017-03-24 09:15:12