是否可以使用automapper更新多对多关系?

时间:2016-06-03 08:37:00

标签: c# entity-framework automapper

我在2个表之间存在多对多的关系,如下例所示:

public class Person
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public virtual ICollection<Book> Books { get; set; }
    }
    public class Book
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public virtual ICollection<Person> Persons { get; set; }
    }

    public class PersonVm
    {
        public int Id { get; set; }
        public string Name {get;set}
        public int[] BookIds { get; set; }

        public ICollection<Book> Books=>_context.Books.Join(BookIds,x=>x.Id,y=>y,(x,y)=>x);
    }

然后我有这样的映射:

 map.CreateMap<PersonVm, Person>()
 .ForMember(x => x.Books, a => a.MapFrom(b => b.BookIds));

我用于插入或更新的方法:

public void Update(PersonVm item)
{
    using (IUnitOfWork db = new UnitOfWork(new ApplicationDbContext()))
    {
        var oldItem = db.Persons.Get(item.Id);
        var newItem = Mapper.Map<Person>(item);

        if (oldItem == null)
        {
            db.Persons.Add(newItem);
        }
        else
        {
            db.Persons.Update(oldItem, newItem);
        }
        db.Complete();
    }

}

使用这段代码,我能够到达“SaveChanges”点,我得到一个错误,说我不允许在Books表中插入重复项(书表设置为不允许重复 - 这里不出意外) 。

问题是为什么实体框架试图插入书籍? 我可以告诉EF不要将书籍插入书籍表吗?

我只想插入Person并将数据插入Person-Books表。

在我的例子中,这个人不存在,必须插入,书籍存在。

任何建议将不胜感激。

编辑:关系

public class PersonMap : EntityTypeConfiguration<Person>
    {
        public PersonMap()
        {
            HasMany(x => x.Books)
                .WithMany(x => x.Persons);
        }
    }

和反向映射:

map.CreateMap<Person, PersonVm>()
.ForMember(x => x.BookIds, a => a.MapFrom(b => b.Books.Select(c => c.Id).ToArray()));

1 个答案:

答案 0 :(得分:1)

当您使用地图中的图书时,他们不会附加。因此,EF并不知道他们已经退出数据库。迭代所有书籍并将它们附加到上下文中。例如:

using(var context = new ApplicationDbContext())
{
  foreach(var book in person.Books)
    context.Books.Attach(book);
} 

提示:当item.Id等于0时,它在db中不存在。