Разделение стола EF Core - PullRequest
3 голосов
/ 30 января 2020

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

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

Я воссоздал заново проблема с использованием таблицы разделения таблицы из EF Core Docs.

https://docs.microsoft.com/en-us/ef/core/modeling/table-splitting https://github.com/aspnet/EntityFramework.Docs/tree/master/samples/core/Modeling/TableSplitting

public class Order
{
    public int Id { get; set; }
    public OrderStatus? Status { get; set; }
    public int SharedInt { get; set; }
    public DetailedOrder DetailedOrder { get; set; }
}

public class DetailedOrder
{
    public int Id { get; set; }
    public OrderStatus? Status { get; set; }
    public string BillingAddress { get; set; }
    public string ShippingAddress { get; set; }
    public int SharedInt { get; set; }
    public byte[] Version { get; set; }
}

 protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            #region TableSplitting
            modelBuilder.Entity<DetailedOrder>(dob =>
            {
                dob.ToTable("Orders");
                dob.Property(o => o.Status).HasColumnName("Status");
                dob.Property(p => p.SharedInt).HasColumnName("Shared");
            });

            modelBuilder.Entity<Order>(ob =>
            {
                ob.ToTable("Orders");
                ob.Property(o => o.Status).HasColumnName("Status");
                ob.Property(p => p.SharedInt).HasColumnName("Shared");

                ob.HasOne(o => o.DetailedOrder).WithOne()
                    .HasForeignKey<DetailedOrder>(o => o.Id);
            });

            #endregion

            #region ConcurrencyToken
            modelBuilder.Entity<Order>()
                .Property<byte[]>("Version").IsRowVersion().HasColumnName("Version");

            modelBuilder.Entity<DetailedOrder>()
                .Property(o => o.Version).IsRowVersion().HasColumnName("Version");
            #endregion
        }

Когда я запускаю образец, я получаю исключение:

System.InvalidOperationException: '' DetailOrder.SharedInt 'и' Order.SharedInt 'оба сопоставлены со столбцом' Shared 'в' Orders ', но настроены с различными значениями обнуляемости.'

Если я надену не сопоставлять свойства с указанными c столбцами, оставляя его в EF Core. Я вижу (глядя на созданную миграцию), что одно из свойств имеет значение nullable == true, несмотря на то, что оно не имеет значения null int.

 protected override void Up(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.CreateTable(
                name: "Orders",
                columns: table => new
                {
                    Id = table.Column<int>(nullable: false)
                        .Annotation("SqlServer:Identity", "1, 1"),
                    Status = table.Column<int>(nullable: true),
                    Order_SharedInt = table.Column<int>(nullable: false),
                    BillingAddress = table.Column<string>(nullable: true),
                    ShippingAddress = table.Column<string>(nullable: true),
                    SharedInt = table.Column<int>(nullable: true),
                    Version = table.Column<byte[]>(rowVersion: true, nullable: true)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_Orders", x => x.Id);
                });
        }

        protected override void Down(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.DropTable(
                name: "Orders");
        }

Есть мысли?

1 Ответ

2 голосов
/ 30 января 2020

К сожалению, в настоящее время (EF Core 3.1) нет решения.

Это побочный эффект следующего критического изменения EF Core 3.0 - Зависимые сущности, совместно использующие таблицу с принципалом, теперь являются необязательными .

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

Похоже, проблема отслеживается как запрос на улучшение (?!) От # 12100: включить настройку обязательных зависимостей 1-к-1 с неизвестным периодом для адресации (в конечном итоге рассмотреть возможность «следующего» выпуска, что бы это ни значило). Все сообщенные связанные проблемы (например, # 18574: расщепление таблиц не работает с ненулевыми ссылочными типами. , который похож на этот) закрыты как «дубликаты», хотя на самом деле это регрессия.

...