我正在使用 Entity Framework 4.3 Code First,我在更新多对多关系时遇到问题。
我定义了以下类:
public abstract class Entity
{
[Column(Order = 0)]
[Key]
public int Id { get; set; }
[Timestamp]
[Column(Order = 1)]
public byte[] Version { get; set; }
}
public class Video : Entity
{
public string Title { get; set; }
public string Description { get; set; }
public TimeSpan Length { get; set; }
public virtual ICollection<Coworker> Coworkers { get; set; }
}
public class Coworker : Entity
{
public string FirstName { get; set; }
public string LastName { get; set; }
public virtual ICollection<Video> Videos { get; set; }
}
创建数据库后,架构看起来正确:也有一个 Videos、Coworkers 和 VideoCoworkers 表,没有
我在 N 层应用程序中使用存储库模式来访问数据库,我的插入和更新方法如下所示:
public T Insert(T entity)
{
//Creates database context. When it disposes, it calls context.SaveChanges()
using (var session = new DatabaseSession())
{
session.Context.Set<T>().Add(entity);
}
}
public T Update(T entity)
{
//Creates database context. When it disposes, it calls context.SaveChanges()
using (var session = new DatabaseSession())
{
entity = session.Context.Set<T>().Attach(entity);
session.Context.Entry(entity).State = EntityState.Modified;
}
return entity;
}
当我更新实体时,我从 DTO 创建实体对象,这就是为什么使用 DbSet.Attach 而不是选择它并逐个更新属性的原因。
当我初始化数据库时,我添加了一些测试数据:
- 创建 3 个同事,我在其中设置名字和姓氏。(甲、乙、丙)
- 创建 3 个视频,我在其中设置标题、描述和长度,还设置了一些同事。第一个视频有A,B,第二个有B,C,第三个有A,C。
当我从代码中列出视频时,我可以看到 Video.Coworkers 集合充满了良好的值,当我在 SQL Server Management Studio 中查询链接表 (VideoCoworkers) 时,它看起来也不错。
我的问题是 当我更新例如视频的标题时,它可以工作。但是,当我尝试从 Video2 中删除现有同事(B 和 C)并尝试添加同事 A 时,关系不会更新。当我只尝试添加新同事或只尝试删除一个时,它也不起作用。我创建了用作 Update() 方法参数的实体,方法是创建一个新的 Video 实体,其中包含一个新的 Coworkers 集合(通过 Id 使用 Find() 方法从数据库中选择)。
更新多对多关系的正确方法是什么?