Тип сущности "EntityName" не имеет определенного ключа. Определите ключ для этого типа объекта - PullRequest
0 голосов
/ 12 мая 2011

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

Таблица: Касса ID INT (ключ) Имя VARCHAR (100)

Таблица: PaymentType ID INT (ключ) Имя VARCHAR (100)

// Я думаю, что это проблема! Таблица: CashierPaymentType CashierID INT (ключ) (внешний ключ) PaymentTypeID INT (ключ) (внешний ключ) Цена МАЛЕНЬКИЕ

Я использую linqpad 4.35.1

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

1 Ответ

2 голосов
/ 15 мая 2011

Проблема в том, что вы говорите 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();
}

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

...