[英]Entity Framework update many-to-many relation in new 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://docs.microsoft.com/en-us/ef/ef6/saving/change-tracking/entity-state
希望這可以幫助
當您在附加到上下文之前修改實體時,上下文將不知道修改。 您應該在附加后修改實體,或者將其狀態設置為“已修改”
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.