Я пытаюсь инициализировать 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;
}
В моей строке подключения есть пароль. Исключение указывает, что пароль не использовался. Строка подключения в моем App.config также имеет пароль. Я не знаю, откуда идет строка подключения. В качестве теста я удалил строку подключения из App.config, и ошибка сохраняется. – user2210050
@ user2210050, возможно, потому, что пользователь, который вы используете, может получить доступ к нему локально, но не удаленно, и вы пытаетесь получить к нему доступ с компьютера, на котором не работает база данных? Тогда вам нужно будет добавить разрешения в вашу базу данных. – Prix
@Prix Я могу SELECT с использованием данной строки подключения, и я могу использовать 'DbContext (connectionString)' и извлекать записи с помощью EF. – user2210050