实体框架与集合对象,使用 Automapper,更新时异常

Posted

技术标签:

【中文标题】实体框架与集合对象,使用 Automapper,更新时异常【英文标题】:Entity framework to object with collection, with Automapper, exception on update 【发布时间】:2012-07-25 08:30:58 【问题描述】:

我有一个 EF 4.1 模型,从我的数据库中生成了两个表 PERSON 和 ADDRESS。

//这个方法有效

public void Update(IPerson person)

    var personDb = _dataContext.PERSON.SingleOrDefault(x => x.ID == person.Id);
    Mapper.Map<Person, PERSON>((Person)person, personDb);
    _dataContext.SaveChanges();

但是当我在 Automapper 映射中删除 .Ignore() 时,我得到了这个异常:

无法初始化 EntityCollection,因为 EntityCollection 所属对象的关系管理器已附加到 ObjectContext。 InitializeRelatedCollection 方法只能在对象图的反序列化期间调用以初始化新的 EntityCollection。

我希望在向现有地址添加新地址时保存人员和地址。

有什么想法吗?

谢谢,

public void AutomapperInit()

    Mapper.CreateMap<Person, PERSON>()
        .ForMember(x => x.ADDRESS, opt => opt.Ignore());
    Mapper.CreateMap<PERSON, Person>()
        .ForMember(dest => dest.Address, option => option.MapFrom(src => src.ADDRESS.Select(address => Mapper.Map<ADDRESS, Address>(address)).ToList()));
    Mapper.CreateMap<Address, ADDRESS>();
    Mapper.CreateMap<ADDRESS, Address>()
        .ForMember(dest => dest.Rue, option => option.MapFrom(src => src.STREET));


public interface IPerson

    int Id  get; set; 
    string FirstName  get; set; 
    string LastName  get; set; 
    ICollection<IAddress> Address  get; set; 


public interface IAddress

    string Rue  get; set; 
    string Number  get; set; 
    int PersonId  get; set; 


class Person : IPerson

    public int Id  get; set; 
    public string FirstName  get; set; 
    public string LastName  get; set; 
    public ICollection<IAddress> Address  get; set; 


 class Address : IAddress

    public string Rue  get; set; 
    public string Number  get; set; 
    public int PersonId  get; set; 

【问题讨论】:

【参考方案1】:

var personDb = Mapper.Map<Person, PERSON>((Person)person, personDb); 
_dataContext.Attach(personDb);
_dataContext.SaveChanges();

给出您期望的结果,还是我误解了您的问题?

【讨论】:

不是 personDB 的问题,而是与 personDb 相关的集合

以上是关于实体框架与集合对象,使用 Automapper,更新时异常的主要内容,如果未能解决你的问题,请参考以下文章

OOM框架AutoMapper基本使用

使用 automapper 更新实体框架实体

使用 Automapper,将 DTO 映射回实体框架,包括引用的实体

AutoMapper

ASP.NET Core搭建多层网站架构6.2-使用AutoMapper映射实体对象

ASP.NET Core Web 应用程序系列- 在ASP.NET Core中使用AutoMapper进行实体映射