我想将具有复杂类型的实体映射到另一个实体。但是,在Main
方法的最后一行a
提出了异常。System.NotSupportedException:无法比较' ConsoleApplication2.ComplexType'类型的元素。仅支持基本类型,枚举类型和实体类型。
如何解决?
我知道我可以将复杂类型属性展平为实体。但是,它涉及大量的代码重复,因此我非常喜欢不需要我将复杂类型属性展平为实体的解决方案。复杂类型my本身包含其他复杂类型,因此解决方案应允许将复杂类型嵌套到复杂类型。
Entity Framework 6.1.3,AutoMapper 3.3.1和4.0.4,SQL Server 2014 SP1 Express,VS 2015,.NET 4.5.2和4.6。
如果.SingleOrDefault(x => x.Id == 1)
或.ProjectTo<MappedEntity>()
被删除,则有效。
如果.SingleOrDefault(x => x.Id == 1)
被重写为.Where(x => x.Id == 1).ToList().SingleOrDefault();
,则仍然无效。
GitHub问题:sunset schedule
using System.Data.Entity;
using System.Linq;
using AutoMapper;
using AutoMapper.QueryableExtensions;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
Database.SetInitializer(new DropCreateDatabaseAlways<ClientContext>());
Mapper.CreateMap<Entity, MappedEntity>();
Mapper.CreateMap<ComplexType, MappedComplexType>();
var clientContext = new ClientContext();
clientContext.Set<Entity>().ProjectTo<MappedEntity>().SingleOrDefault(x => x.Id == 1);
}
}
class ClientContext : DbContext
{
public virtual DbSet<Entity> Entities { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Entity>().HasKey(x => x.Id);
modelBuilder.ComplexType<ComplexType>();
}
}
class Entity
{
public virtual int Id { get; set; }
public virtual ComplexType ComplexType { get; set; }
}
class ComplexType
{
public virtual string Field { get; set; }
}
class MappedEntity
{
public virtual int Id { get; set; }
public virtual MappedComplexType ComplexType { get; set; }
}
class MappedComplexType
{
public virtual string Field { get; set; }
}
}
答案 0 :(得分:1)
这可以帮助:
....Configuration.AllowNullDestinationValues = false;
但这会在其他地图上引起问题!因此,我们可以从config中为ComplexType设置它:
....cfg.ForAllPropertyMaps(p => p.SourceType == typeof(ComplexType), (p, q) => { q.AllowNull(); });