簡體   English   中英

實體框架在新的DBContext中更新多對多關系

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM