Добавление пользовательского свойства навигации в Entity Framework Core для таблицы, у которой нет явного внешнего ключа - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть две отдельные модели, которые логически являются одно-ко-многим, но нет явного отношения внешнего ключа.

Таблица 1 имеет один ко многим с таблицей 2

Модели имеют следующий вид:

public class Table1
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id {get; set;}
}

public class Table2
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id {get; set;}
    public string RelatedTableName {get; set;}
    public string? RelatedTableId {get; set;}
}

В настоящее время таблица 2 будет иметь "Таблица1" и «10» как RelatedTableName и RelatedTableId соответственно. В будущем потенциально может существовать таблица Table3, которая также будет иметь один ко многим с таблицей 2.

Есть ли какой-либо способ, использующий свободный API или что-либо еще, который позволил бы EF понять это отношение?

Причина, по которой я спрашиваю, заключается в том, что запись в Таблице 1 создается одновременно с записями в Таблице 2. Обычно, чтобы связать эти записи, вы должны добавить их в навигационные свойства друг друга, так как идентификатор в Таблице 1 еще не сгенерирован. В этом примере кажется, что это не так просто сделать.

Существует еще один обходной путь - сохранение первого объекта перед вторым. Я бы предпочел не делать этого.

1 Ответ

0 голосов
/ 03 апреля 2020

EF - это, по сути, отображение между вашей C# моделью и схемой БД. То, что вы просили, нельзя сделать в базе данных (один столбец, который может быть внешним ключом для нескольких таблиц). Если базовая база данных не может поддерживать это, то EF также не может поддерживать.

Существует два возможных обходных пути:

Первый:

public class Table2
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id {get; set;}

    public string RelatedTableName {get; set;}
    public int? Table1RowId {get; set;}
    public int? Table2RowId {get; set;}
    // ...
    public int? Table10RowId {get; set;}
}

Секунда

Вы можете иметь подклассы для Table2, каждый из которых имеет внешний ключ для одной из таблиц. См. здесь , чтобы узнать, как реализовать наследование в EF.

...