2015-11-10 2 views
0

Я пытаюсь инициализировать DbContext с использованием конструктора DbContext(DbConnection,bool), но генерируется исключение.Доступ запрещен с помощью DbContext (DbConnection, bool)

Я использую MySQL v5.7.9, Connector/Net 6.9.8.

Чтобы уточнить, я успешно могу подключиться и запросить базу данных, используя MySqlCommand.

 using (var connection = Database.Connect()) 
     { 
      using (MySqlCommand command = connection.CreateCommand()) 
      { 
       command.CommandText = @"SELECT * FROM `database`.`table`"; 
       command.Prepare(); 

       using (IDataReader reader = command.ExecuteReader()) 
       { 
        List<StateObject> items = new List<object>(); 
        while (reader.Read()) 
        { 
         incidents.Add(new StateObject(reader)); 
        } 
        Items = new ObservableCollection<StateObject>(items); 
       } 
      } 
     } 

Исключение:

System.Data.DataException: An exception occurred while initializing the database. See the InnerException for details. ---> System.Data.Entity.Core.ProviderIncompatibleException: The provider did not return a ProviderManifestToken string. ---> MySql.Data.MySqlClient.MySqlException: Authentication to host '127.0.0.1' for user 'root' using method 'mysql_native_password' failed with message: Access denied for user 'floortracker'@'localhost' (using password: NO) ---> MySql.Data.MySqlClient.MySqlException: Access denied for user 'floortracker'@'localhost' (using password: NO) 

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

Я использую этот конструктор неправильно?

DbContext

[DbConfigurationType(typeof(MySqlEFConfiguration))] 
    public class IncidentContext : DbContext 
    { 
     public DbSet<IncidentModel> Incidents { get; set; } 

     public IncidentContext(DbConnection existingConnection, bool contextOwnsConnection) 
      : base(existingConnection, contextOwnsConnection) 
     { 

     } 
    } 

Инцидент

[Table("incidents")] 
    public class IncidentModel : ModelBase 
    { 
     [Key] 
     [Column("incId")] 
     public int IncidentID { get; set; } 
    } 

Используется как так:

 public void GetIncident() 
     { 
       using (var context = new IncidentContext(Database.GetConnection(), true)) 
       { 
        var completeIncident = context.Incidents.FirstOrDefault(incident => incident.IncidentID == Current.IncidentID); 
       } 
     } 

Database статический класс

public static MySqlConnection Connect() 
{ 
    try 
    { 
     var c = new MySqlConnection("server=localhost;uid=username;pwd=password;database=database;port=3306;"); 
     c.Open(); 
     return c; 
    } 
    catch (Exception e) 
    { 
     Console.WriteLine(e); 
    } 
    return null; 
} 

ответ

0

Как указано в исключении, ваш пользователь не имеет права подключиться к базе данных, измените строку подключения (пользователь и pwd) и убедитесь, что у этого пользователя есть доступ к do crud в вашем db.

+0

В моей строке подключения есть пароль. Исключение указывает, что пароль не использовался. Строка подключения в моем App.config также имеет пароль. Я не знаю, откуда идет строка подключения. В качестве теста я удалил строку подключения из App.config, и ошибка сохраняется. – user2210050

+0

@ user2210050, возможно, потому, что пользователь, который вы используете, может получить доступ к нему локально, но не удаленно, и вы пытаетесь получить к нему доступ с компьютера, на котором не работает база данных? Тогда вам нужно будет добавить разрешения в вашу базу данных. – Prix

+0

@Prix Я могу SELECT с использованием данной строки подключения, и я могу использовать 'DbContext (connectionString)' и извлекать записи с помощью EF. – user2210050

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