Тип сущности EntityName не имеет определенного ключа. Определите ключ для этого типа объекта

Я использую Entity Framework 4.1 и не могу добавить соединение на linqpad, он говорит, что мой дочерний объект не имеет определенного ключа объекта. Сообщение: «Тип объекта «CashierPaymentType» не имеет определенного ключа. Определите ключ для этого типа объекта». Я думаю, что это происходит, когда моя дочерняя таблица имеет составной ключ. Пример:

Таблица: Идентификатор кассира INT (ключ) Имя VARCHAR(100)

Таблица: Идентификатор типа платежа INT (ключ) Имя VARCHAR(100)

// Я думаю, это проблема! Таблица: CashierPaymentType CashierID INT (ключ) (внешний ключ) PaymentTypeID INT (ключ) (внешний ключ) Price SMALLMONEY

Я использую линкпад 4.35.1

Любая помощь ?


person Alexandre    schedule 11.05.2011    source источник


Ответы (1)


Проблема в том, что вы говорите LINQPad обновить типизированный DbContext с помощью строки подключения к провайдеру вместо строки подключения Entity Framework.

Вы получите ту же ошибку в Visual Studio, если создадите свой типизированный DbContext со строкой подключения поставщика.

Строка подключения поставщика действительна только в том случае, если вы выполняете сначала код (в этом случае EF выводит модель). В вашем случае EDM является частью вашего проекта и встроен в вашу сборку; поэтому вы должны указать полную строку подключения EF, как указано в вашем app.config, чтобы EF мог ее найти:

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

Другое решение — использовать следующую строку подключения, которая относится к файлу app.config:

name=TestDatabaseEntities

Если вы делаете это в LINQPad, убедитесь, что вы указали, где находится файл app.config, в предоставленном текстовом поле.

Более тонкий момент заключается в том, что файл T4 для вашего DbContext отличается от файла по умолчанию, который создает VS, тем, что в вашем DbContext отсутствует следующий код:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    throw new UnintentionalCodeFirstException();
}

Если это переопределение присутствует, оно дает более полезное сообщение об ошибке, если вы укажете неправильный тип строки подключения.

person Joe Albahari    schedule 15.05.2011