Entity Framework двойное отношение между таблицами

Я работаю над веб-сайтом ASP .Net CORE MVC с Entity Framework, и у меня двойная связь между двумя таблицами:

DocType
# DocTypeName
#DocTypeValidationText

Интерфейс
+ id

DocTypeName и DocTypeValidationText являются ForeignKey для таблицы Интерфейс: один DocType имеет 2 Интерфейс

вот мой класс:

DocType.cs

 public class DocType
{
    [Key]
    public int DocTypeID { get; set; }

    [Required]
    public int DocTypeName { get; set; }
    [ForeignKey("DocTypeName")]
    public virtual TraductionInterface TraductionInterfaceName { get; set; }

    [Required]
    public int DocTypeValidationText { get; set; }
    [ForeignKey("DocTypeValidationText")]
    public virtual TraductionInterface TraductionInterfacevalidationText { get; set; }
}

TraductionInterface.cs

public class TraductionInterface
    {
        [Key]
        public int TraductionInterfaceID;

        [ForeignKey("DocTypeName")]
        public virtual DocType DocTypeName { get; set; }

        [ForeignKey("DocTypeValidationText")]
        public virtual DocType DocTypeValidationText { get; set; }

     }

ApplicationDbContext.cs

builder.Entity<DocType>().ToTable("DocType").HasOne(d => d.TraductionInterfaceName).WithOne(t => t.DocTypeName);
            builder.Entity<DocType>().HasOne(d => d.TraductionInterfacevalidationText).WithOne(t => t.DocTypeValidationText);

но я получаю эту ошибку, когда пытаюсь обновить

Cannot call Property for the property 'DocTypeValidationText' on entity type 'TraductionInterface' because it is configured as a navigation property. Property can only be used to configure scalar properties.

РЕДАКТИРОВАТЬ
Решение @ user1672994, похоже, решило проблему, но применимо только первое отношение:
if
builder.Entity<DocType>().ToTable("DocType").HasOne(d => d.TraductionInterfaceName).WithOne(t => t.DocTypeName);
до
builder.Entity<DocType>().HasOne(d => d.TraductionInterfacevalidationText).WithOne(t => t.DocTypeValidationText);
отношение TraductionInterfaceName применяется, иначе это отношение TraductionInterfacevalidationText. Как я могу заставить эти 2 отношения работать вместе?

Если вам не нужны открытые идентификаторы внешнего ключа, просто удалите атрибуты [ForeignKey], и EF создаст их незаметно. Лично я предпочитаю их разоблачать.

Steve Greene 04.06.2018 17:55
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
200
1

Ответы 1

В самой ошибке указано, что вы должны определить скалярное свойство и при определении отношения ForeignKey. Приведенный ниже код определяет свойства отношения и использует его при присоединении отношения ForeignKey.

public class TraductionInterface
{
    [Key]
    public int TraductionInterfaceID {get; set; }

    public int DocTypeNameId {get; set; }

    [ForeignKey("DocTypeNameId")]
    public virtual DocType DocTypeName { get; set; }

    public int DocTypeValidationTextId {get; set; }

    [ForeignKey("DocTypeValidationTextId")]
    public virtual DocType DocTypeValidationText { get; set; }

 } 

Ваше решение, похоже, исправляет ошибку, но теперь у меня другая ошибка: тип объекта TraductionInterface требует определения первичного ключа. но TraductionInterfaceID в качестве аннотаций [Key, DatabaseGenerated (DatabaseGeneratedOption.Identity)]

Alexis 05.06.2018 09:09

Установите ключ как builder.Entity<TraductionInterface>().ToTable("DocType").Has‌​Key(t => t.TraductionInterfaceID)

user1672994 05.06.2018 09:10

Я пробовал, но получил ошибку: The properties expression 't => Convert(t.TraductionInterfaceID, Object)' is not valid. The expression should represent a property access: 't => t.MyProperty'. When specifying multiple properties use an anonymous type: 't => new { t.MyProperty1, t.MyProperty2 }'. ps: это таблица ("TraductionInterface") вместо ToTable ("DocType") или я ошибаюсь?

Alexis 05.06.2018 09:15

Вы правы, это должен быть table("TraductionInterface")

user1672994 05.06.2018 09:16

Проверьте, нужно ли вам определять HasForeignKey при определении сущностей.

user1672994 05.06.2018 09:22

Отношения один к одному или нулю, похоже, не работают в текучем API: EntityTypeBuilder<DocType> doesn't contain definition for HasRequired и HasForeignKey не работают с отношением один к одному, у меня есть следующие варианты использования: using Microsoft.AspNetCore.Identity.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;, если это поможет

Alexis 05.06.2018 09:52

Что касается ошибки ключа, это был просто {get; set;}, который отсутствовал в ключе.

Alexis 05.06.2018 11:19

Хорошо! Итак, ваша проблема исправлена?

user1672994 05.06.2018 11:24

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

Alexis 05.06.2018 11:47

Думаю, вы ищете обратное свойство: entityframeworktutorial.net/code-first/…

i regular 06.06.2018 23:11

Другие вопросы по теме