我在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()));
答案 0 :(得分:1)
当您使用地图中的图书时,他们不会附加。因此,EF并不知道他们已经退出数据库。迭代所有书籍并将它们附加到上下文中。例如:
using(var context = new ApplicationDbContext())
{
foreach(var book in person.Books)
context.Books.Attach(book);
}
提示:当item.Id等于0时,它在db中不存在。