10

Я использую EF 4.1, и я создаю нормальный файл edmx EF. Я генерирую его из БД.Entity Framework не может использовать DbContext, создаваемая модель

Когда он был создан, щелкните правой кнопкой мыши и выберите элемент генерации кода, чтобы создать новые классы и вместо этого используйте DbContext. Я использую генератор шаблона DbContext.

Все работает нормально.

Тогда я TRIE запросить контекст:

using (var context = new PasDBEntities()) 
{ 
    var client=context.ClientCompanies.SingleOrDefault(_=>_.ID==clientCompanyId); 
    if(client!=null) 

У меня нет проблемы при создании нового экземпляра контекста, но когда я пытаюсь запросить его проблемы возникают. Я застрял в UnintentionalCodeFirstException. И получает ошибку:

{"Code generated using the T4 templates for Database First and Model First development may not work correctly if used in Code First mode. To continue using Database First or Model First ensure that the Entity Framework connection string is specified in the config file of executing application. To use these classes, that were generated from Database First or Model First, with Code First add any additional configuration using attributes or the DbModelBuilder API and then remove the code that throws this exception."}

Я не хочу использовать код первого, но я не знаю, могу ли я «переключить» его, или где проблема.

Для справки, вот мой конструктор ...

public partial class PasDBEntities : DbContext 
{ 
    public PasDBEntities() 
     : base("PasDBEntities") 
    { 
    } 

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

... и строка подключения:

<connectionStrings> 
    <add name="PasDBEntities" 
     connectionString="metadata=res://*/PasDB.csdl| 
            res://*/PasDB.ssdl| 
            res://*/PasDB.msl; 
          provider=System.Data.SqlClient; 
          provider connection string=&quot; 
          data source=localhost; 
          initial catalog=PasDB; 
          integrated security=True; 
          pooling=False; 
          multipleactiveresultsets=True; 
          App=EntityFramework&quot;" 
     providerName="System.Data.EntityClient" /> 
</connectionStrings> 
+6

Это строка подключения в «конфигурационном файле ** выполнения приложения **» (цитата исключение), а не только в конфигурационном файле проекта библиотеки? – Slauma

+1

Вы так правы. Я не знал, что мне пришлось добавить дополнительный файл конфигурации для строки подключения в моем модульном тестовом проекте, чтобы иметь возможность использовать EF. Это решило мою проблему, добавив еще один файл app.config. – Fore

ответ

7

Я вижу, что вы используете EDMX с шаблонами (.TT) для генерации классы. Но если вы получаете информацию из существующей базы данных, мастер создаст ConnectionString, совместимый с ObjectContext (информация о метаданных и поставщик сущности).

Проблема заключается в том, что строка соединения, которую вы используете, предназначена для ObjectContext (сначала для базы данных и для модели). Для DbContext вы должны использовать строку соединения без информации метаданных.

Ваша строка подключения должна быть:

<connectionStrings> 
<add name="PasDBEntities" 
    connectionString="data source=localhost; 
         initial catalog=PasDB; 
         integrated security=True; 
         pooling=False; 
         multipleactiveresultsets=True; 
         App=EntityFramework" 
    providerName="System.Data.SqlClient" /> 

+1

На самом деле в EF5 вы можете использовать соединение edmx и entity с DbContext. В VS2012 T4 были изменены для генерации DbContext для DatabaseFirst. – Pawel

+1

Я на самом деле пытался сначала перейти от кода, сначала в базу данных. В вашем ответе указано, что нам нужно использовать специальную заполненную метаданные строку - спасибо за это. В основном это означает, что при использовании мастера ADO.NET используется строка «Сохранить соединительную строку» NEEDS. – Worthy7

Смежные вопросы