Entity Framework Core - вставка однонаправленных родительских отношений с родителями - PullRequest
0 голосов
/ 07 ноября 2018

Так как 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, есть ли способ обойти эту проблему? Я бы предпочел сохранить их сразу. Я знаю, что хранимая процедура также является опцией, но я бы предпочел не делать этого.

Спасибо за помощь!

1 Ответ

0 голосов
/ 07 ноября 2018

Это потому что это беглое отображение

.HasForeignKey<Provision>(t => t.ProvisionId)

сообщает EF Core, что Provision является зависимой сущностью и имеет FK для основной сущности CompanyLeaveProvision, тогда как модель базы данных противоположна.

Так что просто измените Provision на CompanyLeaveProvision

.HasForeignKey<CompanyLeaveProvision>(t => t.ProvisionId)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...