WedX - журнал о программировании и компьютерных науках

Как предоставить свойство внешнего ключа существующему объекту, имеющему навигационное свойство, с помощью EF6 Code First

У меня есть объект, который уже используется с базовой базой данных, и он был создан только с навигационным свойством для необязательного объекта (1: 0..1). Таким образом, по соглашениям по умолчанию EF создал столбец внешнего ключа, допускающий значение NULL, в БД и дал ему имя «MyProp_Id» с подчеркиванием в соответствии с этим соглашением.

Теперь я хочу предоставить этот внешний ключ как свойство объекта, потому что это облегчит мне некоторые сценарии. Я не хочу переименовывать/изменять базовый столбец внешнего ключа в БД (MyProp_Id). На самом деле не должно быть никаких базовых обновлений БД, я просто хочу показать этот FK на объекте. Пример кода для пояснения:

public class MyEntityA 
{
    public long Id { get; set; }

    //public long? MyOptionalEntityB_Id { get; set; }  <== this is what I am trying to add
    //public long? MyOptionalEntityBId { get; set; }  <== this didn't work either

    public MyEntityB MyOptionalEntityB { get; set; }

}

Я попытался просто добавить свойство «MyOptionalEntity_Id» в качестве свойства объекта, надеясь, что EF «автоматически» увидит, что, поскольку имена одинаковы, он просто сопоставит и будет счастлив. БЕЗ КУБИКОВ.

Затем я попытался назвать свое свойство «MyOptionalEntityId» (без подчеркивания), но по-прежнему NO DICE.

Затем я попытался добавить явную конфигурацию сопоставления, чтобы сказать:

this.Property(p => p.MyOptionalEntityId).HasColumnName("MyOptionalEntity_Id");

БЕЗ КУБИКОВ

Есть ли способ сделать это? Это понятно и имеет смысл?


Ответы:


1

Попробуйте добавить иностранный ключевой атрибут.

public long? MyOptionalEntityB_Id { get; set; }
[ForeignKey("MyOptionalEntityB_Id")]
public MyEntityB MyOptionalEntityB { get; set; }

Или с помощью быстрого API.

 modelBuilder.Entity<MyEntityA >()
    .HasOptional(x => x.MyOptionalEntityB)
    .WithMany().HasForeignKey(x => x.MyOptionalEntityB_Id);
          // ^^^ -> if MyEntityB has collection of MyEntityA, mention it
31.07.2014
  • да, вы не можете идентифицировать нетрадиционные имена FK с hascolumnname 31.07.2014
  • Я выбрал вариант 2, так как мы не используем парадигму аннотаций и сохраняем наши сущности как POCO без зависимостей EF. Спасибо! 31.07.2014
  • @JulieLerman Значит, невозможно одновременно выставить столбец FK в моем объекте и присвоить ему собственное имя в базе данных? 09.09.2014
  • @HenriqueMiranda, возможно, если вы используете HasForeignKey и HasColumnName вместе, что Джули имела в виду, насколько я понимаю, столбец FK в сущности не соответствует соглашение, ‘<navigation property name><principal primary key property name>’, ‘<principal class name><primary key property name>’, поэтому его необходимо настроить с атрибутом ForeignKey или HasForeignKey 10.09.2014
  • Вы всегда должны использовать ключевое слово nameof вместо того, чтобы вводить имена свойств. Таким образом, если вы переименуете свойство, сопоставление по-прежнему будет правильным. 14.09.2018
  • Итак, вам нужно вручную добавить свойство MyOptionalEntityB_Id? 05.02.2020
  • Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]