Разделение таблиц с составным первичным ключом в базе данных EF Core - PullRequest
2 голосов
/ 25 июня 2019

Я пытаюсь разбить таблицу в репозитории EF Core, который имеет составной первичный ключ.Но он генерирует исключение InvalidOperationException, говорящее о том, что он не может найти первичный ключ в производной таблице.

'Тип сущности' DetailOrder 'требует определения первичного ключа.'

Чтобы проверить это, я взял пример кода для разделения таблицы из репозитория EntityFramework.Docs и изменил его, добавив в него составной PK:

public class Order
{
    public int OrderId { get; set; }
    public int Rev { get; set; }
    public OrderStatus Status { get; set; }
    public DetailedOrder DetailedOrder { get; set; }
}

public class DetailedOrder : Order
{
    public string BillingAddress { get; set; }
    public string ShippingAddress { get; set; }
    public byte[] Version { get; set; }
}

public class TableSplittingContext : DbContext
{
    public DbSet<Order> Orders { get; set; }
    public DbSet<DetailedOrder> DetailedOrders { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        => optionsBuilder
            .UseSqlServer(@"Server = 20.0.5.64\\SQLEXPRESS; Database=EFSamples;User Id = cp; Password=crest1*");

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<DetailedOrder>()
                        .ToTable("Orders")
                        .HasBaseType((string)null)
                        .Ignore(o => o.DetailedOrder);

        modelBuilder.Entity<Order>(
                entity =>
                    {
                        entity.HasKey(ck => new { Id = ck.OrderId, ck.Rev });
                        entity.ToTable("Orders")
                            .HasOne(o => o.DetailedOrder).WithOne()
                            .HasForeignKey<Order>(o => new { Id = o.OrderId, o.Rev });
                    });

    }
}

1 Ответ

3 голосов
/ 25 июня 2019

Для типа объекта "DetailOrder" требуется определить первичный ключ.

(составной) PK должен быть явно определен для всех объектов, где PK не может быть автоматически получен в соответствии с соглашениями об именовании EF Core . В примере используется ПК с именем Id, поэтому ему не требуется дополнительная настройка.

Правильная конфигурация размещенной модели с разбиением таблицы должна быть такой:

modelBuilder.Entity<DetailedOrder>(entity =>
{
    entity.HasBaseType((string)null)
        .Ignore(o => o.DetailedOrder);
    entity.HasKey(o => new { o.OrderId, o.Rev }); // <--
    entity.ToTable("Orders");
});

modelBuilder.Entity<Order>(entity =>
{
    entity.HasKey(o => new { o.OrderId, o.Rev }); // <--
    entity.ToTable("Orders");
    entity.HasOne(o => o.DetailedOrder).WithOne()
        .HasForeignKey<Order>(o => new { Id = o.OrderId, o.Rev });
});

Фактически единственная разница между регулярным отношением один к одному и разбиением таблицы заключается в плавной конфигурации ToTable, определяющей одну и ту же таблицу для основного и зависимого объекта. Другие части конфигурации объекта должны быть такими же, как и без разделения таблицы.

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