我有以下两个由Entity Framework生成的类:
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; }
}
几乎一样,休? 在我的业务层中,我从数据库中读取了一个房屋列表。然后我使用Automapper将整个列表映射到我的Business house类列表:
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);
“错误映射类型”。
我想,这可能是,因为每个人都指向一个房子,每个房子都指向人。因为我在BusinessLayer中不需要这个“圆圈”,所以我使用[IgnoreMap]修饰了这个属性,但没有任何成功。错误仍然存在。
有人建议我做错了吗?
答案 0 :(得分:0)
是的,错误仍然没有ignoremap。 内部异常告诉我以下内容:
{"Error mapping types.\r\n\r\nMapping types:\r\nList`1 -> List`1\r\nSystem.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]]"}
所以House-Type就是问题所在。 我还尝试添加另一张地图:
Mapper.Initialize(cfg => cfg.CreateMap<DataAccessLayer.House, BusinessEntities.House>());
Mapper.Initialize(cfg => cfg.CreateMap<DataAccessLayer.Person, BusinessEntities.Person>());
没有成功和相同的错误。 :-(
答案 1 :(得分:0)
所以这最终解决了我的问题:
Mapper.Initialize(cfg => {
cfg.CreateMap<List<House>, List<HouseViewModel>>();
cfg.CreateMap<List<Person>, List<PersonViewModel>>();
});
答案 2 :(得分:-1)
尝试使用
config.CreateMap<TSource,TDestination>().PreserveReferences()
您有循环引用Person-> House-> ICollection
循环引用
以前,AutoMapper可以通过跟踪所映射的内容来处理循环引用,并在每个映射上检查源/目标对象的本地哈希表,以查看该项目是否已被映射。事实证明,这种跟踪非常昂贵,您需要使用PreserveReferences选择启用圆形地图。或者,您可以配置MaxDepth:
// Self-referential mapping
cfg.CreateMap<Category, CategoryDto>().MaxDepth(3);
// Circular references between users and groups
cfg.CreateMap<User, UserDto>().PreserveReferences();