EF4.1 ConnectionString.ProviderName, возвращающий другой класс - PullRequest
0 голосов
/ 02 декабря 2011

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

В файле ObjectContextBuilder.cs есть следующий метод:

public ObjectContextBuilder(string connectionStringName, string[] mappingAssemblies, bool recreateDatabaseIfExists, bool lazyLoadingEnabled)
{
    this.Conventions.Remove<IncludeMetadataConvention>();

    _cnStringSettings = ConfigurationManager.ConnectionStrings[connectionStringName];
    _factory = DbProviderFactories.GetFactory(_cnStringSettings.ProviderName);
    _recreateDatabaseIfExists = recreateDatabaseIfExists;
    _lazyLoadingEnabled = lazyLoadingEnabled;

    AddConfigurations(mappingAssemblies);
}

Я предполагаю, что EDMX будет содержать сопоставления, которые требуются предыдущему методу, поэтому я пытаюсь добавить сималярный метод, который будет принимать ObjectContext из EDMX, например:

 public ObjectContextBuilder(string connectionStringName, ObjectContext context, bool recreateDatabaseIfExists, bool lazyLoadingEnabled)
{
    this.Conventions.Remove<IncludeMetadataConvention>();

    _cnStringSettings = ConfigurationManager.ConnectionStrings[connectionStringName];
    _factory = DbProviderFactories.GetFactory(_cnStringSettings.ProviderName);
    _recreateDatabaseIfExists = recreateDatabaseIfExists;
    _lazyLoadingEnabled = lazyLoadingEnabled;
}

И вотвызывающий метод:

    ObjectContextManager.InitStorage(new SimpleObjectContextStorage());
    var context = ((IObjectContextAdapter)new SidekickEntities());
    ObjectContextManager.Init("SidekickEntities", context.ObjectContext, true);

Когда выполнение доходит до назначения _factory, я получаю ошибку, которая гласит:

Unable to find the requested .Net Framework Data Provider.  It may not be installed.

Когда я смотрю на _cnStringSettings, поставщик - System.Data.SqlClient, нопри назначении _factory _cnStringSettings.ProviderName имеет значение System.Data.EntityClient.

Я предполагаю, что это потому, что я пытаюсь использовать сущность, сгенерированную EDMX, и хотел бы знать, есть ли способ получить мой новыйметод для работы.Я довольно новичок в EF Framework и все еще нахожусь в крутой кривой обучения, поэтому, пожалуйста, дайте мне знать, если я совершенно не согласен с тем, что я пытаюсь.

Вот строка подключения, как она хранится в приложении.Config

<add name="SidekickEntities" connectionString="metadata=res://SidekickModel/SidekickModel.csdl|res://SidekickModel/SidekickModel.ssdl|res://SidekickModel/SidekickModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=percepsrvr;Initial Catalog=Sidekick;Integrated Security=True;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />

Ответы [ 2 ]

0 голосов
/ 06 декабря 2011

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

_employeeRepository = new GenericRepository(new SidekickEntities());

GenericRepository - это объект в коде, который напрямую принимает DbContext.

0 голосов
/ 02 декабря 2011

Наличие существующей базы данных не означает, что вы должны сначала использовать модель (к счастью). См. Scott Gu's Использование EF «Code First» с существующей базой данных и скринкаст TechEd 2011 Code First Development в Microsoft ADO.NET Entity Framework 4.1 для получения подробной информации. Сработало очень хорошо для меня.

Мне было очень больно использовать EF Model First из-за того, что это не так просто. Это становится ужасно очень быстро, особенно, когда вы связываетесь с EDMX.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...