EF Core 2 - Отношения только с 1 навигационным свойством / знание отношений? - PullRequest
2 голосов
/ 16 мая 2019

Я использую ASP.NET Core 2.2 с EF Core 2.2 и сервером SQL.

В настоящее время я работаю над функцией, в которой у меня есть следующие классы:

TABLE Foo
-------------------------------------------------------------
Column                       Type          Remark
--------------------------------------------------------------
Id                           GUID          PK
IntroId                      GUID?         Nullable FK
IntroText                    Content       Navigation Property
--------------------------------------------------------------

TABLE Content
--------------------------------------------------------------
Column                       Type          Remark
--------------------------------------------------------------
Id                           GUID          PK
Text                         string
--------------------------------------------------------------

Этомоя свободная конфигурация API, связанная с моей проблемой:

Foo

builder.HasOne(b => b.IntroText)
    .WithOne()
    .IsRequired(false);

Контент
Контент имеет конфигурацию только для себя.

Содержимое может содержать много текста, и по ряду причин эти вещи не сохраняются непосредственно в таблице / классе Foo.

Как видите, я пытаюсь убедиться, что Content не имеет свойства внешнего ключа / навигации для Foo.Это потому, что эти свойства не являются частью Content и потому, что в будущем больше классов / таблиц могут иметь такие вещи, как IntroText , которые сохраняются в таблице Content, и я не хочу Contentбыть заполненным обнуляемыми внешними ключами / навигационными свойствами.

Возможно ли это с EF Core?

Ошибка, которую я получаю прямо сейчас:

Child /не может быть определена зависимая сторона для отношений «один к одному» между «Foo.IntroText» и «Content».Чтобы определить дочернюю / зависимую сторону отношения, настройте свойство внешнего ключа.Если эти переходы не должны быть частью одного и того же отношения, настройте их без указания обратного.См. http://go.microsoft.com/fwlink/?LinkId=724062 для получения более подробной информации.


Я бы принял ответ, который позволяет базе данных иметь отношения, которых я не вижу в своей кодовой базе, но я бы предпочел, чтобыContent ничего не знает о Foo

Большое спасибо за помощь!

1 Ответ

1 голос
/ 17 мая 2019

Если у вас есть объект IntroTextId, представленный в вашей сущности Foo, вам нужно связать его как FK в отношении «один к одному»:

builder.HasOne(b => b.IntroText)
    .WithOne()
    .HasForeignKey(b => b.IntroTextId)
    .IsRequired(false);

Обычно, хотя я не хочу, чтобы свойства FKраскрыты в моих сущностях, потому что это вызывает два источника правды для того, на что ссылается сущность.(Foo.IntroTextId против Foo.IntroText.IntroTextId) В этом случае вы используете свойство тени для FK:

builder.HasOne(b => b.IntroText)
    .WithOne()
    .HasForeignKey("IntroTextId")
    .IsRequired(false);

Это похоже (и более интуитивно понятно) на использование Map (MapKey) в EF 6сопоставлять ФК без раскрытия свойств.

.Map(x => x.MapKey("IntroTextId"));
...