Я пытаюсь использовать разбиение таблицы в ядре 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");
}
Есть мысли?