Так как Table Per Type недоступен в Core, мне пришлось немного обойтись, чтобы получить свои сущности так, как они мне нравятся. По сути, у меня есть базовый класс с его свойствами и свойство навигации к его родителю:
public class Provision
{
public Guid ProvisionId { get; set; }
public string ProvisionName { get; set; }
public string ProvisionDescription { get; set; }
public Provision(){}
}
public class CompanyLeaveProvision
{
public Guid ProvisionId { get; set; }
public int CompanyId { get; set; }
public Provision Provision { get; set; }
public CompanyLeaveProvision() { }
}
Конфигурация:
public void Configure(EntityTypeBuilder<Provision> builder)
{
// Primary Key
builder.HasKey(t => t.ProvisionId);
// Properties
builder.Property(t => t.ProvisionName)
.IsRequired()
.HasMaxLength(40);
builder.Property(t => t.ProvisionDescription)
.HasMaxLength(500);
// Table & Column Mappings
builder.Property(t => t.ProvisionId).HasColumnName("ProvisionID");
builder.Property(t => t.ProvisionName).HasColumnName("ProvisionName");
builder.Property(t => t.ProvisionDescription).HasColumnName("ProvisionDescription");
builder.ToTable("Provision", "Organization");
}
public void Configure(EntityTypeBuilder<CompanyLeaveProvision> builder)
{
// Primary Key
builder.HasKey(t => t.ProvisionId);
// Properties
builder.Property(t => t.ProvisionId)
.IsRequired();
builder.Property(t => t.CompanyId)
.IsRequired();
// Table & Column Mappings
builder.ToTable("CompanyLeaveProvision", "Organization");
builder.Property(t => t.ProvisionId).HasColumnName("ProvisionID");
builder.Property(t => t.CompanyId).HasColumnName("CompanyID");
builder.HasOne(t => t.Provision).WithOne().HasForeignKey<Provision>(t => t.ProvisionId);
}
Мой контекст:
ProvisionContext: DbContext, IContext {
public DbSet<Provision> Provisions { get; set; }
public DbSet<CompanyLeaveProvision> CompanyLeaveProvisions { get; set;}
// OnModelCreating and other code below
}
У меня есть ограничение внешнего ключа для таблицы Organization.CompanyProvision
, которое ссылается на свойство ProvisionId
в таблице Organization.Provision
.
То, что происходит, это то, что CompanyProvision
вставляется перед базой Provision
, что приводит к этой ошибке:
Оператор INSERT конфликтовал с ограничением FOREIGN KEY
"Fk_CompanyLeaveProvision_Provision". Конфликт произошел в
база данных "Dev", таблица "Organization.Provision", столбец "ProvisionID".
Чтобы попытаться сохранить, вот код, который я звоню:
_context.Entry(command.Provision.Provision).State = EntityState.Added;
_context.Entry(command.Provision).State = EntityState.Added;
await _context.SaveChangesAsync();
Помимо звонка SaveChanges()
после each _context.Entry(MyEntity).State = EntityState.Added
, есть ли способ обойти эту проблему? Я бы предпочел сохранить их сразу. Я знаю, что хранимая процедура также является опцией, но я бы предпочел не делать этого.
Спасибо за помощь!