我有如下两个实体类,多对多关系
public class Task : Entity { public virtual ICollection<Person> Assignees { get; set; } }
public class Person : Entity { public virtual ICollection<Task> AcceptedTasks { get; set; } }
以下的mapping代码
HasMany(t => t.Assignees).WithMany(p => p.AcceptedTasks).Map(m => { m.MapLeftKey("TaskId").MapRightKey("PersonId").ToTable("Person_AcceptedTask"); });
一下是出问题的方法:
public void DesignateTask(Domain.Model.Task task, IEnumerable<Domain.Model.Person> persons, Domain.Model.Person charge = null) { try { if (charge == null || charge.IsTransient()) { charge = persons.FirstOrDefault(); } if (!charge.IsTransient()) { if (task.Assignees == null) task = TaskRepository.GetTaskWithAssignees(task.Id); TaskRepository.TrackItem(task);//call:Entry<TEntity>(item).State = System.Data.EntityState.Unchanged; task.InChargeId = charge.Id; foreach (var p in persons) { if (p != null) task.Assignees.Add(p); } TaskRepository.UnitOfWork.Commit();//call:SaveChanges(); } } catch (Exception) { TaskRepository.UnitOfWork.Rollback(); throw; } }
参数传入的task和persons都是已经存在数据库里的实体。我只是想在这些实体之间建立关系(原本没有关系),上面的代码却会在数据库里插入一组和persons字段值一样的对象,在新对象和task之间建立关系。。。
请问应该如何修改已有实体间的关系呢?
你两个类都用了ICollection<xxx>互相引用,在数据中会生成第三张以这两个类的名称组合命令的表,你看一下,这个表里存放的就是这两个类的数据之间的关系!
这我知道,我问的是用EF怎么修改这个关系,我总不能用sql改这个表吧
@alexstrasza: 如果是主外键关系的话,不能用ICollection<xxx>,可以用 public virtual xxx Name{get;set;}这样,我给你看一个图吧,当时做的笔记,你认真看了就明白了.
楼上的答非所问。。
我自己找到了问题所在,因为我的两组的实体没有被同一个dbcontext追踪,所以被一个dbcontext当成了新加实体。
只要Entry一下,追踪所有的实体就好了