Внешний ключ EF для нескольких таблиц - PullRequest
0 голосов
/ 11 февраля 2020

Допустим, у меня есть следующие три сущности, определенные в соответствии с тремя таблицами, а именно Entity1, Entity2 и Entity3

public class Entity1 {
    public Guid Id { get; set; }
    public string Foo { get; set; }
}

public class Entity2 {
    public Guid Id { get; set; }
    public string Bar { get; set; }
}

public class Entity2 {
    public Guid Id { get; set; }
    public int Boo { get; set; }
}

Теперь предположим, что каждая из этих сущностей связана друг с другом с помощью свойства position, которое, например, обеспечивает упорядочение этих объектов в списке. Чтобы сохранить эту информацию о местоположении, я создаю другую таблицу EntityPosition следующим образом

public class EntityPosition {
    public Guid EntityId { get; set; }
    public int Position { get; set; }
}

, где EntityId - это суррогатный ключ к Entity1.Id, Entity2.Id или Entity3.Id, т. Е. Одна запись в таблица EntityPosition соответствует одному из трех объектов. Я хотел бы настроить это так, чтобы при добавлении новой сущности я мог сделать это следующим образом

var position = new EntityPosition {
    Position = 0
};

var entity = new Entity2{
    EntityPosition = position
};

context.Entity2.Add(entity);
context.SaveChanges();

, чтобы EF правильно создал идентификатор Guid для Entity2 и назначил эту же Идентификатор EntityId в таблице EntityPosition. Поэтому я попытался добавить свойство навигации EntityPosition к каждой из таблиц сущностей следующим образом

public class Entity1 {
    public Guid Id { get; set; }
    public string Foo { get; set; }
    public EntityPosition EntityPosition { get; set; }
}

public class Entity2 {
    public Guid Id { get; set; }
    public string Bar { get; set; }
    public EntityPosition EntityPosition { get; set; }
}

public class Entity2 {
    public Guid Id { get; set; }
    public int Boo { get; set; }
    public EntityPosition EntityPosition { get; set; }
}

и эквивалентные свойства навигации в EntityPosition, т. Е.

public class EntityPosition {
    public Guid EntityId { get; set; }
    public int Position { get; set; }
    public Entity1 { get; set; }
    public Entity2 { get; set; }
    public Entity3 { get; set; }
}

, затем я также добавил следующую свободную конфигурацию для каждого из классов сущностей

builder.HasOne(x => x.PathEntityPosition)
    .WithOne(x => x.Entity1)
    .HasForeignKey<PathEntityPosition>(x => x.EntityId);

builder.HasOne(x => x.PathEntityPosition)
    .WithOne(x => x.Entity2)
    .HasForeignKey<PathEntityPosition>(x => x.EntityId);

builder.HasOne(x => x.PathEntityPosition)
    .WithOne(x => x.Entity3)
    .HasForeignKey<PathEntityPosition>(x => x.EntityId);

Однако в настоящее время я получаю ошибку ограничения FK при попытке добавить новую сущность с позицией. Правильно ли я настроил это при попытке связать одну таблицу с несколькими таблицами?

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