使用AutoMapper和Entity Framework映射具有复杂类型的实体时出现NotSuportedException

时间:2015-10-07 15:03:10

标签: c# entity-framework automapper

我想将具有复杂类型的实体映射到另一个实体。但是,在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; }
    }
}

1 个答案:

答案 0 :(得分:1)

这可以帮助:

....Configuration.AllowNullDestinationValues = false;

但这会在其他地图上引起问题!因此,我们可以从config中为ComplexType设置它:

....cfg.ForAllPropertyMaps(p => p.SourceType == typeof(ComplexType), (p, q) => { q.AllowNull(); });
  • 相关有用链接:

https://www.csharpcodi.com/csharp-examples/AutoMapper.IProfileExpression.ForAllPropertyMaps(System.Func,%20System.Action)/

https://docs.automapper.org/en/stable/10.0-Upgrade-Guide.html?highlight=AllowNullDestinationValues#allownull-allows-you-to-override-per-member-allownulldestinationvalues-and-allownullcollections