具有动态类型的 AutoMapper:缺少类型映射配置或不支持的映射
AutoMapper with dynamic type: Missing type map configuration or unsupported mapping
答案:CreateMissingTypeMaps
必须设置为 true
才能使动态映射工作。
public IEnumerable<T> GetDummies<T>(IEnumerable<dynamic> dummies)
{
var config =
new MapperConfiguration(c => { c.CreateMissingTypeMaps = true; });
IMapper mapper = config.CreateMapper();
return dummies.Select(mapper.Map<T>).ToList();
}
我有围绕 Entity Framework 的包装器来执行对数据库的查询。我想允许用户 select 仅需要属性,但保留实体类型的结果。
这是伪代码(没有使用 EF,但有同样的问题)
class Program
{
static void Main(string[] args)
{
var dummies = new[]
{
new DummyContainer
{
Name = "First",
Description = "First dummy",
DummyNumbers = new List<int> { 1, 2, 3 },
Foo = new FooThingy { Title = "Foo thingy" }
}
};
var smallDummies = dummies.Select(d => new { d.Name }).ToList();
List<DummyContainer> fullDummies = smallDummies.Select(Mapper.Map<DummyContainer>).ToList();
Debugger.Break();
}
}
class DummyContainer
{
public string Name { get; set; }
public string Description { get; set; }
public ICollection<int> DummyNumbers { get; set; }
public FooThingy Foo { get; set; }
}
class FooThingy
{
public string Title { get; set; }
}
获取此异常:
Missing type map configuration or unsupported mapping.
Mapping types:
<>f__AnonymousType0`1 -> DummyContainer
<>f__AnonymousType0`1[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] -> AutoMapperWithGenerics.DummyContainer
Destination path:
DummyContainer
Source value:
{ Name = First }
我有点卡在这里,因为文档指出 AutoMapper 使用 属性 名称映射回对象:Dynamic and ExpandoObject Mapping.
请注意上面的代码只是示例。在我的应用程序中,事情变得有点疯狂,因为我实际上在使用泛型,例如
Mapper.Map<TEntity>
...它应该保持这种状态 - 我不知道使用的是什么实体类型。我的期望只是:将属性映射到现有类型,如果缺少,请设置 default(T)
.
编辑:我尝试指定从 dynamic
到 T
的映射器,这里几乎是完整的代码:
class Program
{
static void Main(string[] args)
{
// ...
var dumminator = new DummyService();
IEnumerable<DummyContainer> bigDummies = dumminator.GetDummies<DummyContainer>(smallDummies);
Debugger.Break();
}
}
class DummyService
{
public IEnumerable<T> GetDummies<T>(IEnumerable<dynamic> dummies)
{
var config = new MapperConfiguration(c => c.CreateMap<dynamic, T>());
IMapper mapper = config.CreateMapper();
return dummies.Select(mapper.Map<T>).ToList();
}
}
...这不会因异常而死,但是结果非常空(所有属性都有 default
值。
您需要使用 Mapper.DynamicMap<T>
而不是 Mapper.Map<T>
从动态或匿名映射 类
List<DummyContainer> fullDummies = smallDummies.Select(Mapper.DynamicMap<DummyContainer>).ToList();
您可以全局配置它,而不是弃用 DynamicMap
。
var config = new MapperConfiguration(cfg => cfg.CreateMissingTypeMaps = true);
Reference 到 wiki。
你好,类似的答案,但不要忘记在你的 class 上有一个私有构造函数,不要不验证内联映射。
public class Player
{
private Player() {}.....
}
var mapper = new MapperConfiguration(cfg =>
{
cfg.ValidateInlineMaps = false;
cfg.CreateMissingTypeMaps = true;
}).CreateMapper();
var player= mapper.Map<Player>(anonymousData);
答案:CreateMissingTypeMaps
必须设置为 true
才能使动态映射工作。
public IEnumerable<T> GetDummies<T>(IEnumerable<dynamic> dummies)
{
var config =
new MapperConfiguration(c => { c.CreateMissingTypeMaps = true; });
IMapper mapper = config.CreateMapper();
return dummies.Select(mapper.Map<T>).ToList();
}
我有围绕 Entity Framework 的包装器来执行对数据库的查询。我想允许用户 select 仅需要属性,但保留实体类型的结果。
这是伪代码(没有使用 EF,但有同样的问题)
class Program
{
static void Main(string[] args)
{
var dummies = new[]
{
new DummyContainer
{
Name = "First",
Description = "First dummy",
DummyNumbers = new List<int> { 1, 2, 3 },
Foo = new FooThingy { Title = "Foo thingy" }
}
};
var smallDummies = dummies.Select(d => new { d.Name }).ToList();
List<DummyContainer> fullDummies = smallDummies.Select(Mapper.Map<DummyContainer>).ToList();
Debugger.Break();
}
}
class DummyContainer
{
public string Name { get; set; }
public string Description { get; set; }
public ICollection<int> DummyNumbers { get; set; }
public FooThingy Foo { get; set; }
}
class FooThingy
{
public string Title { get; set; }
}
获取此异常:
Missing type map configuration or unsupported mapping.
Mapping types:
<>f__AnonymousType0`1 -> DummyContainer
<>f__AnonymousType0`1[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] -> AutoMapperWithGenerics.DummyContainer
Destination path:
DummyContainer
Source value:
{ Name = First }
我有点卡在这里,因为文档指出 AutoMapper 使用 属性 名称映射回对象:Dynamic and ExpandoObject Mapping.
请注意上面的代码只是示例。在我的应用程序中,事情变得有点疯狂,因为我实际上在使用泛型,例如
Mapper.Map<TEntity>
...它应该保持这种状态 - 我不知道使用的是什么实体类型。我的期望只是:将属性映射到现有类型,如果缺少,请设置 default(T)
.
编辑:我尝试指定从 dynamic
到 T
的映射器,这里几乎是完整的代码:
class Program
{
static void Main(string[] args)
{
// ...
var dumminator = new DummyService();
IEnumerable<DummyContainer> bigDummies = dumminator.GetDummies<DummyContainer>(smallDummies);
Debugger.Break();
}
}
class DummyService
{
public IEnumerable<T> GetDummies<T>(IEnumerable<dynamic> dummies)
{
var config = new MapperConfiguration(c => c.CreateMap<dynamic, T>());
IMapper mapper = config.CreateMapper();
return dummies.Select(mapper.Map<T>).ToList();
}
}
...这不会因异常而死,但是结果非常空(所有属性都有 default
值。
您需要使用 Mapper.DynamicMap<T>
而不是 Mapper.Map<T>
从动态或匿名映射 类
List<DummyContainer> fullDummies = smallDummies.Select(Mapper.DynamicMap<DummyContainer>).ToList();
您可以全局配置它,而不是弃用 DynamicMap
。
var config = new MapperConfiguration(cfg => cfg.CreateMissingTypeMaps = true);
Reference 到 wiki。
你好,类似的答案,但不要忘记在你的 class 上有一个私有构造函数,不要不验证内联映射。
public class Player
{
private Player() {}.....
}
var mapper = new MapperConfiguration(cfg =>
{
cfg.ValidateInlineMaps = false;
cfg.CreateMissingTypeMaps = true;
}).CreateMapper();
var player= mapper.Map<Player>(anonymousData);