我正在使用virtual
關鍵字爲我的一些屬性進行EF延遲加載。將源映射到目標時,我的模型中標記爲virtual
的所有屬性應該從AutoMapper中忽略。如何忽略所有標記爲虛擬的屬性
是否有一種自動方式可以實現這一點,或者我應該手動忽略每個成員?
我正在使用virtual
關鍵字爲我的一些屬性進行EF延遲加載。將源映射到目標時,我的模型中標記爲virtual
的所有屬性應該從AutoMapper中忽略。如何忽略所有標記爲虛擬的屬性
是否有一種自動方式可以實現這一點,或者我應該手動忽略每個成員?
您可以創建一個映射擴展並使用它:
namespace MywebProject.Extensions.Mapping
{
public static class IgnoreVirtualExtensions
{
public static IMappingExpression<TSource, TDestination>
IgnoreAllVirtual<TSource, TDestination>(
this IMappingExpression<TSource, TDestination> expression)
{
var desType = typeof(TDestination);
foreach (var property in desType.GetProperties().Where(p =>
p.GetGetMethod().IsVirtual))
{
expression.ForMember(property.Name, opt => opt.Ignore());
}
return expression;
}
}
}
用法:
Mapper.CreateMap<Source,Destination>().IgnoreAllVirtual();
inquisitive
的回答能正常工作,但它可以增強現實生活中的使用,當從數據模型執行一些映射到服務模型時,應該忽略來自源類型的虛擬成員。另外,如果類型實現了某些接口,那些屬性將顯示爲虛擬的,因此必須添加!IsFinal
條件才能刪除這些虛假肯定的虛擬屬性。
public static class AutoMapperExtensions
{
public static IMappingExpression<TSource, TDestination> IgnoreAllDestinationVirtual<TSource, TDestination>(this IMappingExpression<TSource, TDestination> expression)
{
var desType = typeof(TDestination);
foreach (var property in desType.GetProperties().Where(p => p.GetGetMethod().IsVirtual && !p.GetGetMethod().IsFinal))
{
expression.ForMember(property.Name, opt => opt.Ignore());
}
return expression;
}
public static IMappingExpression<TSource, TDestination> IgnoreAllSourceVirtual<TSource, TDestination>(this IMappingExpression<TSource, TDestination> expression)
{
var srcType = typeof(TSource);
foreach (var property in srcType.GetProperties().Where(p => p.GetGetMethod().IsVirtual && !p.GetGetMethod().IsFinal))
{
expression.ForSourceMember(property.Name, opt => opt.Ignore());
}
return expression;
}
}
您不能在automapper開箱即用,但可以使用此規則在代碼中創建地圖。 –
好奇,你爲什麼要忽略這些?如果你想忽略它們,爲什麼它們會成爲你的目標類型? –
這些是EF Code First Models中其他實體的導航屬性。創建新條目時,我需要將我的視圖模型與表單中的數據映射到域模型中的屬性(Ef Code First模型)。通常不映射屬性不會導致任何錯誤或異常,但我在單元測試中使用AutoMapper的Mapper.AssertConfigurationIsValid(),如果我沒有映射目標模型的所有屬性,斷言將引發異常 –