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

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

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

Imgur

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

Imgur

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

Imgur

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

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

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

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 Entity File и на поверхности дизайна сотрите объект, а затем замените его на поверхности. В бесчисленное количество раз это исправляло проблемы с созданными объектами. Когда вы СОХРАНИТЕ, он должен автоматически запускать шаблоны T4 (файлы *.tt). Если вы не можете выбрать их, щелкните правой кнопкой мыши и выберите "Запустить пользовательский инструмент". Это просто генерирует объекты POCO или объекты Context.

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

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

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

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

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"

Разрешенные операции в контексте должны выполняться без ошибок

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