EFC не может удалить отношение «многие ко многим» в памяти sqlite, но работает в рабочей среде sql - PullRequest
0 голосов
/ 24 июня 2019

Я пытаюсь сначала создать базу данных с использованием кода EFCore.Я успешно создал его после некоторых проблем.Затем я подумал, что могу создавать модульные тесты, но примеры, с которыми я работал в реальной реализации базы данных, не работали с поставщиками памяти (EFCore и Sqlite).

Отношения какследует: A, B, C - сущности A1- * B имеет отношение «многие к одному». BC - отношение «многие ко многим». AC - отношение «многие ко многим».

И когда я пытаюсь удалить что-либо, находясь в памяти, он выдает ошибки, аналогичные приведенным ниже, где я пытался удалить запись из столбца B.

'The property 'AId' on entity type 'AC' is part of a key and so cannot be modified or marked as modified. To change the principal of an existing entity with an identifying foreign key first delete the dependent and invoke 'SaveChanges' then associate the dependent with the new principal.'

Я пытался в памяти EFCoreпрямо, но узнал, что он не моделирует реляционные базы данных, поэтому я попробовал sqlite в памяти.Следующий код работает на сервере sql. (Исключая части sqlite)

using (var connection = new SqliteConnection("DataSource=:memory:"))
            {
                connection.Open();
                var options = new DbContextOptionsBuilder<DBContext>()
                   .UseSqlite(connection)
                   .Options;
                using (var _context = new DBContext(options))
                {
                    SeedData(_context);
                    _context.Database.EnsureCreated();
                    _context.Bs.Remove(_context.Bs.SingleOrDefault(s => s.Id == 1));

                    _context.SaveChanges();
                }
            }

Но выдает вышеупомянутую ошибку.

Это реляционная модель в fluentapi

 modelBuilder.Entity<A>(pa =>
            {
                pa.HasKey(key => new { key.Id });
                pa.HasAlternateKey(key => new { key.Id, key.ExternalUID, key.InstitutionID });
            });

            modelBuilder.Entity<B>(sa =>
            {
                sa.HasKey(key => new { key.Id });
                sa.HasOne(o => o.A)
                    .WithMany(s => s.Bs)
                    .OnDelete(DeleteBehavior.Restrict)
                    .HasForeignKey(k => k.AId);
                sa.HasAlternateKey(key => new { key.Id, key.AId });
            });

            modelBuilder.Entity<C>(l =>
            {
                l.HasKey(key => new { key.Id });

            });



            modelBuilder.Entity<AC>(al =>
            {
                al.HasKey(key => new { key.AId, key.CId });
                al.HasOne(sa => sa.A)
                    .WithMany(s => s.ACs)
                    .OnDelete(DeleteBehavior.Cascade)
                    .HasForeignKey(s => s.AId);
                al.HasOne(sa => sa.C)
                    .WithMany(s => s.ACs)
                    .OnDelete(DeleteBehavior.Cascade)
                    .HasForeignKey(o => o.CId);
            });

            modelBuilder.Entity<BC>(sal =>
            {
                sal.HasKey(key => new { key.BId, key.CId});                    
                sal.HasOne(sa => sa.B)
                    .WithMany(s => s.BCs)
                    .OnDelete(DeleteBehavior.Cascade)
                    .HasForeignKey(s => s.BId);
                sal.HasOne(sa => sa.C)
                    .WithMany(s => s.BCs)
                    .OnDelete(DeleteBehavior.Cascade)
                    .HasForeignKey(o => o.CId);
            });

После перехода на sqlite в памяти я ожидал получить реляционную базу данных, которая отражала бы то, что я испытываю с реальной базой данных.IE.Удаление сущностей в графе и их каскадирование только для реляционных записей (BC AC) и не касание первичной сущности (такой как A, B, C).Как и в примере, где я пытаюсь удалить B, но по какой-то причине он хочет изменить A.

Я хотел бы, чтобы вы помогли мне понять, что я делаю неправильно, или указали мне в направленииОбходной путь для модульного тестирования.

...