使用自动映射器将实体框架类映射到业务类



我有以下两个由实体框架生成的类:

public partial class Person
{
    public int id { get; set; }
    public string namen { get; set; }
    public int house { get; set; }
    [IgnoreMap]
    public virtual House House1 { get; set; }
}
public partial class House
{
    public House()
    {
        this.Persons = new HashSet<Person>();
    }
    public int id { get; set; }
    public string street { get; set; }
    public string city { get; set; }
    public ICollection<Person> Persons { get; set; }
}

然后,我的业务层中还有这两个类似的类:

public class House
{        
    public House()
    {
        this.Persons = new HashSet<Person>();
    }
    public int id { get; set; }
    public string street { get; set; }
    public string city { get; set; }        
    public virtual ICollection<Person> Persons { get; set; }
}
public class Person
{
    public int id { get; set; }
    public string namen { get; set; }
    public int house { get; set; }        
}

差不多,咦?在我的业务层中,我从数据库中读取了房屋列表。然后,我使用自动映射器将整个列表映射到我的商业房屋类列表:

    public List<elci.BusinessEntities.House> getHouses()
    {
        YardEntities cx = new YardEntities();
        Mapper.Initialize(cfg => cfg.CreateMap<DataAccessLayer.House, BusinessEntities.House>());
        List<DataAccessLayer.House> dhl = cx.Houses.ToList();
        List<BusinessEntities.House> bhl = Mapper.Map<List<DataAccessLayer.House>, List<BusinessEntities.House>>(dhl);
        return bhl;
    }

但是,在以下行中,我收到运行时异常:

 Mapper.Map<List<DataAccessLayer.House>, List<BusinessEntities.House>>(dhl);

"错误映射类型"。

我想,这可能是,因为每个人都指向一个房子,每个房子都指向人。因为我在业务层中不需要这个"圆圈",所以我用[IgnoreMap]装饰了此属性,但没有成功。错误仍然存在。

有没有暗示我做错了什么?

所以这最终解决了我的问题:

        Mapper.Initialize(cfg => {
            cfg.CreateMap<List<House>, List<HouseViewModel>>();
            cfg.CreateMap<List<Person>, List<PersonViewModel>>();
        });

是的,错误仍然存在,没有忽略映射。内部异常告诉我以下内容:

{"Error mapping types.rnrnMapping types:rnList`1 -> List`1rnSystem.Collections.Generic.List`1[[elci.DataAccessLayer.House, DataAccessLayer, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] -> System.Collections.Generic.List`1[[elci.BusinessEntities.House, BusinessEntities, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]"}

所以房子类型是问题所在。我还尝试添加另一张地图:

        Mapper.Initialize(cfg => cfg.CreateMap<DataAccessLayer.House, BusinessEntities.House>());
        Mapper.Initialize(cfg => cfg.CreateMap<DataAccessLayer.Person, BusinessEntities.Person>());

没有成功和同样的错误。

尝试使用

config.CreateMap<TSource,TDestination>().PreserveReferences()

你有循环引用 人->房子->

循环引用

以前,AutoMapper 可以通过跟踪映射的内容来处理循环引用,并在每次映射时检查源/目标对象的本地哈希表以查看项目是否已映射。事实证明,这种跟踪非常昂贵,您需要选择使用保留引用才能使用圆形地图才能工作。或者,您可以配置最大深度:

// Self-referential mapping
cfg.CreateMap<Category, CategoryDto>().MaxDepth(3);
// Circular references between users and groups
cfg.CreateMap<User, UserDto>().PreserveReferences();

自动映射器文档

相关内容

  • 没有找到相关文章

最新更新