Установка MigrationsAssembly просто сообщает контексту, где найти сборку миграций, вам все равно нужно подробно запускать ее (много раз вы не хотите запускать миграции каждый раз, когда запускаете приложение). Вам нужно позвонить
myDbContext.Database.Migrate();
Для выполнения миграции.
https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations/#apply-migrations-at-runtime
Это разрешает Вас Вам DataReader без потребности знания, какой тип DataReader Вы используете (т.е. SqlDataReader, OleDbDataReader, EtcDataReader
), поэтому если когда-нибудь Вы хотите изменить datareader, Вы используете его, не повлияет на Вас логика, другими словами, он дает Вам абстракцию. Например:
можно использовать
IDbCommand command = GiveMeSomeCommand();
IDataReader r = command.ExecuteReader();
не зная, какого поставщика Вы используете
это может быть:
private static IDbCommand GiveMeSomeCommand()
{
return new OleDbCommand();
}
или это может быть
private static IDbCommand GiveMeSomeCommand()
{
return new SqlCommand();
}
или что бы то ни было.
Править:
Можно также использовать DBFactories.
DbProviderFactory factory = GiveMeSomeFactory();
IDbCommand command = factory.CreateCommand();
IDataReader r = command.ExecuteReader();
//and create more objects
IDataAdapter adapter = factory.CreateDataAdapter();
IDbConnection conn = factory.CreateConnection();
и затем создайте своего поставщика в другом слое
private DbProviderFactory GiveMeSomeFactory()
{
if(something)
return SqlClientFactory.Instance;
else if(somethingElse)
return OracleFactory.Instance;
else if(notThisAndNotThat)
return MySqlFactory.Instance;
else
return WhateverFactory.Instance;
}
Метод возвратит объект, который является экземпляром класса, и тот тип класса будет поддерживать IDataReader
.
Точка, тип объекта не важен, просто то, что класс реализует интерфейс.
При вождении автомобиля Вы не должны знать, является ли это брод или Тойота, Вы водите автомобиль тот же путь.
Ведущий интерфейс является тем же, после того как автомобиль поддерживает интерфейс, можно управлять им.
Так же с IDataReader
, после того как класс, который возвращается, поддерживает интерфейс, можно использовать его.
Это возвращает интерфейс, потому что реализация интерфейса не важна, просто API, который обеспечивает интерфейс.
Это не возвращает Интерфейс по сути, но вместо этого объект, который поддерживает тот интерфейс.
"Возвращается, интерфейс" действительно означает:
Возвращает экземпляр некоторого класса, который реализует тот интерфейс
В этом случае это возвращает объект, очень похожий на a SqlDataReader
объект, который позволяет Вам для выполнения методов как Read()
и реализации IDisposable
и IDataRecord
интерфейсы.
Это возвращает объект, который реализует этот конкретный интерфейс, и это - все, о чем Вы действительно заботитесь. Объект является a IDataReader
, и может выполнить все методы IDataReader
имеет.