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

Сначала я выбираю базу данных: Imgur

Вот пример таблицы, в которой возникла эта проблема. Как видите, столбец EntityId является первичным ключом:

Имгур

Импортированная таблица в обозревателе моделей показывает, что она имеет первичный ключ:

Имгур

Но код сгенерированного класса не имеет столбца EntityId, украшенного атрибутом Key:

Имгур

Во время выполнения я получаю эту ошибку:

Дополнительная информация. Во время создания модели обнаружена одна или несколько ошибок проверки: EntityType 'Entity' не имеет определенного ключа. Определите ключ для этого EntityType.

Почему я должен вручную украшать столбец EntityId ключевым атрибутом? Разве EntityFramework не должен позаботиться обо всем этом, учитывая, что в первую очередь это база данных?


person party_Rob    schedule 08.02.2017    source источник
comment
Похоже, вы используете обычную строку подключения, а не строку подключения объекта (с путями метаданных).   -  person Gert Arnold    schedule 08.02.2017
comment
@ Герт Арнольд - ты был прав. В используемой строке подключения не было части метаданных. Как только я добавил его, я смог выполнять операции с коллекцией Entity в контексте.   -  person party_Rob    schedule 15.02.2017
comment
Включенные изображения с тех пор сломаны. Этот вопрос зависит от них и теперь бесполезен. Если вы можете исправить изображения, пожалуйста, сделайте это.   -  person bendl    schedule 05.04.2021


Ответы (2)


Как правило, у меня есть опыт работы с EF4 через EF 6.1.3 и немного с Entity Core (был EF7, а затем MS развлекался с именованием). Как правило, если вы сначала делаете базу данных, вы не получаете украшения из своего шаблона t4. Я только сейчас посмотрел на свой, и у меня нет украшения для ключа, только для конструктора и ссылки на навигацию teOrder обратно к нему.

введите здесь описание изображения

Я могу просто сохранить Entity, и мой код работает с этим:

  using (var context = new EntityTesting.TesterEntities())
  {
    var nPerson = new tePerson { FirstName = "Test", LastName = "Tester" };

    context.tePerson.Add(nPerson);
    context.SaveChanges();
  }

Я бы предложил следующее:

  1. Перейдите к файлу сущности (имя).edmx и на поверхности дизайна сотрите объект, а затем замените его на поверхности. Бесчисленное количество раз это исправляло проблемы с сгенерированными объектами. Когда вы СОХРАНИТЕ, он должен автоматически запускать шаблоны T4 (файлы *.tt). Если нет, вы можете выбрать их, щелкните правой кнопкой мыши и выберите «Запустить пользовательский инструмент». Это просто генерирует объекты POCO или объекты Context.

  2. Если это действительно ошибка таблицы, то, как правило, она НЕ имеет ключа. Вы показываете, что это так. Есть ли способ отразить точно такую ​​же логику таблицы и подтвердить, что ключ не имеет ничего необычного и является просто старым первичным ключом?

  3. Создайте новую таблицу с аналогичной структурой, но не точную копию и новый файл сущности и подтвердите, что вы можете его создать.

Таблицы довольно прямолинейны с EF или настолько прямолинейны, насколько это возможно. Вы создаете их в SQL, убедитесь, что у вас есть ключ, добавляете его в область разработки, сохраняете, он генерирует объекты для вас. Если у вас есть другие вещи под капотом, такие как пользовательские процессы, подключенные к нему, или другие необычные элементы навигации, это одно. Единственная другая вещь была бы, если бы у него был очень старый тип SQL в качестве ключа. Я знаю, что тип «Текст» и EF плохо сочетаются друг с другом. Могут быть и другие типы, которые ведут себя так же.

person djangojazz    schedule 08.02.2017

Эта проблема устранена путем включения части «метаданные» в строку подключения. Сначала моя строка подключения выглядела так:

data source=.;initial catalog=TestDatabase;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework;

Что вызвало ошибку.

Изменение моей строки подключения на это:

metadata=res://*/DbContexts.TestContext.csdl|res://*/DbContexts.TestContext.ssdl|res://*/DbContexts.TestContext.msl;provider=System.Data.SqlClient;provider connection string="data source=.;initial catalog=TestDatabase;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"

Разрешено выполнение операций над контекстом без ошибок

person party_Rob    schedule 15.02.2017