У меня есть отношение многие ко многим между группами и пользователями. Я хотел бы загрузить элементы из 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
}
}
}