0-1 отношение к себе в EF Core - PullRequest
       4

0-1 отношение к себе в EF Core

0 голосов
/ 14 февраля 2019

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

class Key {
    string Id;
    string ReplacesId;
    Key Replaces;
    string ReplacedById;
    Key ReplacedBy;
    DateTime Expires;
    // ...
}

Поэтому, когда я захочу заменить его, я создам другой ключ и затем буду ссылаться на новые и старые ключи друг на друга.И если кто-то из них будет удален, другой тоже будет.

И вот как я реализовал это отображение Fluent:

modelBuilder.Entity<Key>().HasOne(x => x.ReplacedBy)
            .WithOne(x => x.Replaces)
            .IsRequired(false)
            .OnDelete(DeleteBehavior.Cascade);

Логика замены:

oldKey.ReplacedBy = newKey;
oldKey.ReplacedById = newKey.Id;
newKey.Replaces = oldKey;
newKey.ReplacesId = oldKey.Id;

_dbContext.Keys.Update(newKey);
_dbContext.Keys.Update(oldKey);

await _dbContext.SaveChangesAsync();

Но похоже, что ReplacedById ReplacesId или одно из них используются как обычные поля и не FK, потому что, когда я пытаюсь удалить одно из них, они не каскадируются.

МожетЯ делаю эту работу, или я должен просто ввести Rotations/Replacements таблицу?

1 Ответ

0 голосов
/ 15 февраля 2019

Но похоже, что ReplacedById ReplacesId или одно из них используются как обычные поля и не FK, потому что когда я пытаюсь удалить одно из них, они не каскадируются.

Это связано с тем, что ваша Fluent API конфигурация выполнена неправильно.На самом деле это должно быть следующим образом:

modelBuilder.Entity<Key>().HasOne(k => k.Replaces)
                          .WithOne()
                          .HasForeignKey<Key>(k => k.ReplacesId)
                          .IsRequired(false);

modelBuilder.Entity<Key>().HasOne(k => k.ReplacedBy)
                          .WithOne()
                          .HasForeignKey<Key>(k => k.ReplacedById)
                          .IsRequired(false);

Теперь все будет генерироваться и работать как положено!

Примечание: оно будет генерировать onDelete: ReferentialAction.Restrict, потому что вы не можете каскадировать их, потому что это приведет к множественномукаскадные дорожки.

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