2013-08-20 2 views
0

Я работаю с ASP.NET MVC4, и я пытаюсь переместить слой доступа к данным в отдельный проект. Каждый пользователь на моем сайте получает свою собственную базу данных, поэтому мне нужно указать другую базу данных в строке подключения для каждого пользователя. То, как я сейчас делаю это:Gettting Невозможно определить имя поставщика для подключения к MySql

public TableDbContext GetTableDbContextForUser(string userName) 
{ 
    MySqlConnection connection = new MySqlConnection(getUserConnectionString(userName)); 
    return new MySqlTableDbContext(connection); 
} 

private string getUserConnectionString(string userName) 
{ 
    ConnectionStringSettings csSettings = ConfigurationManager.ConnectionStrings["MySqlConnection"]; 

    MySqlConnectionStringBuilder csBuilder = new MySqlConnectionStringBuilder(csSettings.ConnectionString); 
    csBuilder.Database += "_" + userName; 

    return csBuilder.GetConnectionString(true); 
} 

И мой конструктор:

public MySqlTableDbContext(MySqlConnection connection) 
    : base(connection, false) //Inherits from DbContext 
{ } 

И, наконец, моя строка соединения (это в Web.config в моем главном проекте и App.config в моей базе данных проект):

<connectionStrings> 
    <add name="MySqlConnection" providerName="MySql.Data.MySqlClient" connectionString="server=localhost;User Id=root;Persist Security Info=True;database=cybercomm;password=*;DefaultCommandTimeout=0;" /> 
</connectionStrings> 

MySqlTableDbContext в моем проекте базы данных, и я пытаюсь использовать его в своем главном проекте. Он будет создаваться только штраф, однако, когда я вызвать любой метод через него я получаю следующее сообщение об ошибке:

System.NotSupportedException was unhandled by user code 
HResult=-2146233067 
Message=Unable to determine the provider name for connection of type 'MySql.Data.MySqlClient.MySqlConnection'. 
Source=EntityFramework 
StackTrace: 
    at System.Data.Entity.ModelConfiguration.Utilities.DbConnectionExtensions.GetProviderInvariantName(DbConnection connection) 
    at System.Data.Entity.Internal.InternalConnection.get_ProviderName() 
    at System.Data.Entity.Internal.LazyInternalContext.InitializeContext() 
    at System.Data.Entity.Internal.InternalContext.Initialize() 
    at System.Data.Entity.Internal.InternalContext.ExecuteSqlCommand(String sql, Object[] parameters) 
    at System.Data.Entity.Database.ExecuteSqlCommand(String sql, Object[] parameters) 
    at EPSCoR.Web.Database.Context.MySqlTableDbContext.DropTable(String table) in c:\Users\Devin\Documents\Visual Studio 2012\Projects\EPSCoR\Web\Database\Context\MySqlTableDbContext.cs:line 110 
    at EPSCoR.Web.App.Repositories.Basic.BasicTableRepo.Drop(String tableName) in c:\Users\Devin\Documents\Visual Studio 2012\Projects\EPSCoR\Web\App\Repositories\Basic\BasicTableRepo.cs:line 71 
    at EPSCoR.Web.App.Controllers.TableIndexController.Delete(Int32 id) in c:\Users\Devin\Documents\Visual Studio 2012\Projects\EPSCoR\Web\App\Controllers\ModelController.cs:line 172 
    at lambda_method(Closure , ControllerBase , Object[]) 
    at System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) 
    at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) 
    at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) 
    at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass42.<BeginInvokeSynchronousActionMethod>b__41() 
    at System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass8`1.<BeginSynchronous>b__7(IAsyncResult _) 
    at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End() 
    at System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult) 
    at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass37.<>c__DisplayClass39.<BeginInvokeActionMethodWithFilters>b__33() 
    at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49() 

Я знаю, что моя строка соединения работает, потому что, когда я прохожу DbContext имени соединения («MySqlConnection») в конструкторе I могут обновлять и создавать модели. Единственное, когда я пытаюсь изменить параметр базы данных в строке, которую он разбивает. Также это сработало, когда все было в одном проекте, поэтому я знаю, что это должно работать как-то.

Есть ли что-нибудь, что мне не хватает здесь?

В случае, если это может помочь, у меня есть MySql.Data v6.7.4.0 и EF v5, установленные через nuget.

ответ

0

Я не знаю, почему это сработало, но я переустановил пакеты EntityFramework и MySql.Data, а затем все снова заработало.

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