EF Core Обновление связанных сущностей во многих отношениях - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть следующий dbContext:

class MyDbContext: DbContext
{
    public DbSet<First> Firsts { get; set; }
    public DbSet<Second> Seconds { get; set; }
    public DbSet<FirstSecond> FirstSeconds { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<First>().HasMany(f => f.FirstSeconds).WithOne(fs => fs.First);
        modelBuilder.Entity<First>().Property(prop => prop.RowVersion).IsRowVersion();

        modelBuilder.Entity<Second>().HasMany(s => s.FirstSeconds).WithOne(fs => fs.Second);
        modelBuilder.Entity<Second>().Property(prop => prop.RowVersion).IsRowVersion();

        modelBuilder.Entity<FirstSecond>(e => e.HasKey(k => new
        {
            k.FirstId, k.SecondId
        }));
        modelBuilder.Entity<FirstSecond>().Property(prop => prop.RowVersion).IsRowVersion();
    }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer("Server=localhost;Database=myDataBase;Trusted_Connection=True;");
        base.OnConfiguring(optionsBuilder);
    }
}

public class First
{
    public Guid Id { get; set; }
    public virtual Collection<FirstSecond> FirstSeconds { get; set; }
    public byte[] RowVersion { get; set; }
}

public class Second
{
    public Guid Id { get; set; }
    public virtual Collection<FirstSecond> FirstSeconds { get; set; }
    public byte[] RowVersion { get; set; }
}

public class FirstSecond
{
    public Guid FirstId { get; set; }
    public Guid SecondId { get; set; }
    public virtual First First { get; set; }
    public virtual Second Second { get; set; }
    public byte[] RowVersion { get; set; }
}

}

У меня есть четыре экземпляра первого класса.И создавая экземпляр класса Second, а затем в том же dbContext, я обновляю этот экземпляр, заменяя третий экземпляр первого класса в созданном экземпляре Second:

            using (var dbContext = new MyDbContext())
        {
            var firstInstances = dbContext.Firsts.ToList();
            var secondInstanceToCreate = new Second()
            {
                Id = Guid.NewGuid(),
                FirstSeconds = new Collection<FirstSecond>()
                {
                    new FirstSecond()
                    {
                        FirstId = firstInstances[0].Id,
                    },
                    new FirstSecond()
                    {
                        FirstId = firstInstances[1].Id
                    },
                    new FirstSecond()
                    {
                        FirstId = firstInstances[2].Id,
                    },
                }
            };

            dbContext.Seconds.Add(secondInstanceToCreate);
            dbContext.SaveChanges();

            obj = dbContext.Seconds.Include(s => s.FirstSeconds).ThenInclude(ss => ss.First)
                .First(e => e.Id == secondInstanceToCreate.Id);

            var newCollection = new Collection<FirstSecond>()
            {
                obj.FirstSeconds[0],
                obj.FirstSeconds[1],
                new FirstSecond()
                {
                    FirstId = firstInstances[3].Id,
                }
            };

            obj.FirstSeconds = newCollection;

            dbContext.Update(obj);
            dbContext.SaveChanges();
        }

В этом случае во втором экземпляре класса я будуожидаемое поведение: до обновления во втором экземпляре у меня есть экземпляры первого 1,2,3.После обновления у меня будет 1,2,4.

second:{
firsts: [1,2,3]
}
//update operation performed
second:{
firsts:[1,2,4]
}

ВОПРОС ЕСТЬ: Почему, если я выполню операцию обновления в отдельном dbContext, у меня будут экземпляры First 1,23,4 вместо 1,2,4?

//after update operation
second:{
firsts: [1,2,3,4]
}
...