Entity Framework обновляет отношение «многие ко многим» в новом DBContext - PullRequest
0 голосов
/ 06 сентября 2018

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

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Когда вы изменяете свою сущность до присоединения к контексту, контекст не будет знать об изменении. Вы должны либо изменить сущность после присоединения, либо установить для нее состояние Modified

Присоединение существующего, но измененного объекта к контексту

0 голосов
/ 06 сентября 2018

Если у вас есть одна уже загруженная сущность и из другого DBContext и вы хотите изменить ее на другой DBContext, вам нужно присоединить вашу модель к вашему новому DBContext.

Это происходит из-за того, что вы, новый DbConext, не можете знать, что что-то меняется, поскольку не могут отслеживать это.

См. Ссылку ниже.

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

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...