实体框架与集合对象,使用 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,更新时异常的主要内容,如果未能解决你的问题,请参考以下文章
使用 Automapper,将 DTO 映射回实体框架,包括引用的实体