实体框架更新新 DBContext 中的多对多关系



我在组和用户之间有一个多对多关系。我想从DBContext加载元素,修改它们,然后将它们附加到新的DBContext(由于各种原因,在加载和保存之间保持上下文活动不是一个好的解决方案(。

在下面的代码中,我重新创建了场景,但由于某种原因,重新附加和保存似乎不起作用。

public class TUser
{
[Key]
public int Id { get; set; }
public ICollection<TGroup> Groups { get; set; } = new List<TGroup>();
}
public class TGroup
{
[Key]
public int Id { get; set; }
}
public class UserGroupDbContext : DbContext
{
public UserGroupDbContext(DbConnection existingConnection, bool contextOwnsConnection)
: base(existingConnection, contextOwnsConnection)
{
}
public DbSet<TUser> Users { get; set; }
public DbSet<TGroup> Groups { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<TUser>()
.HasMany(u => u.Groups)
.WithMany()
.Map(m =>
{
m.MapLeftKey("UserId");
m.MapRightKey("GroupId");
m.ToTable("UserGroup");
});
base.OnModelCreating(modelBuilder);
}
}
public class UserRepositoryTest
{
public UserRepositoryTest()
{
var group1 = new TGroup();
var group2 = new TGroup();
var group3 = new TGroup();
var user = new TUser { Groups = new List<TGroup> { group1, group2 } };
var dbContextFixture = new DbContextFixture<UserGroupDbContext>();
using (var dbContext = dbContextFixture.CreateContext())
{
dbContext.Groups.Add(group1);
dbContext.Groups.Add(group2);
dbContext.Groups.Add(group3);
dbContext.Users.Add(user);
dbContext.SaveChanges();
}
user.Groups.Remove(group2);
user.Groups.Add(group3);
using (var dbContext = dbContextFixture.CreateContext())
{
dbContext.Users.Attach(user);
dbContext.SaveChanges();
}
using (var dbContext = dbContextFixture.CreateContext())
{
var loadedUser = dbContext.Users.Include(u => u.Groups).Single();
Assert.True(loadedUser.Groups.Any(g => g.Id == group1.Id));
Assert.True(loadedUser.Groups.Any(g => g.Id == group3.Id)); // <-- This line fails
Assert.False(loadedUser.Groups.Any(g => g.Id == group2.Id)); // <-- This line fails
}
}
}

当您在附加到上下文之前修改实体时,上下文将不知道修改。应在附加后修改实体,或将其"状态"设置为"已修改">

将现有但已修改的实体附加到上下文

当您有一个已经加载的实体并且来自另一个 DBContext 并且想要用另一个 DBContext 更改它时,您需要将模型附加到新的 DBContext 中。

发生这种情况是因为您新的 DbConext 无法知道某些内容是否发生变化,因为它无法跟踪它。

Se 下面的链接。

https://learn.microsoft.com/en-us/ef/ef6/saving/change-tracking/entity-state

希望这有帮助

最新更新