EntityFramework v6. База данных первая. Не украшать свойство ключом, хотя в таблице есть первичный ключ
Сначала я выбираю базу данных:
Вот пример таблицы, которая испытывает эту проблему. Как видите, столбец EntityId является первичным ключом:
Импортированная таблица в браузере модели показывает, что она имеет первичный ключ:
Но код для сгенерированного класса не имеет столбца EntityId, украшенного атрибутом Key:
Во время выполнения я получаю эту ошибку:
Дополнительная информация: одна или несколько ошибок проверки были обнаружены во время генерации модели: 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();
}
Я хотел бы предложить следующее:
Перейдите в свой (имя).edmx Entity File и на поверхности дизайна сотрите объект, а затем замените его на поверхности. В бесчисленное количество раз это исправляло проблемы с созданными объектами. Когда вы СОХРАНИТЕ, он должен автоматически запускать шаблоны T4 (файлы *.tt). Если вы не можете выбрать их, щелкните правой кнопкой мыши и выберите "Запустить пользовательский инструмент". Это просто генерирует объекты POCO или объекты Context.
Если это действительно ошибка таблицы, то обычно она НЕ имеет ключа. Вы показываете это, хотя. Можно ли в любом случае отразить ту же самую логику таблицы и подтвердить, что ключ не имеет ничего необычного и является простым старым ключом Primary Key?
Создайте новую таблицу с похожей структурой, но не точную копию и новый файл сущностей, и подтвердите, что вы можете его создать.
Таблицы довольно просты с 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"
Разрешенные операции в контексте должны выполняться без ошибок