Где правильное место, чтобы позвонитьDbContext и initalizer базы данных в Entity Framework 6
Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyDbContext, Configuration>());?
Ниже приводится описание архитектуры для моего проекта.
У меня есть проект MVC + webAPI, где Data Access Layer - отдельный проект, и он использует Entity Framework 6.1.3. Я определил класс MyDbContext
:
public class EedezDbContext : System.Data.Entity.DbContext
Я также Configuration
класс с Seed
методом.
internal sealed class Configuration : DbMigrationsConfiguration<MyDbContext>
{
public Configuration()
{
AutomaticMigrationsEnabled = false;
}
protected override void Seed(Eedez.Dal.DbContext.EedezDbContext context)
{
// running seeds
}
}
DataAccessLayer
также DataAccessors
, вызывающую Entity Framework методы, чтобы сделать операции с данными. Каждый метод dataaccessor создает экземпляр MyDbContext
. Например, вот один базовый метод доступа:
public class AccessorBase<T> : IAccessorBase<T> where T : BaseEntity
{
public virtual IEnumerable<T> GetByFilter(Expression<Func<T, bool>> filter)
{
using (MyDbContext context = new MyDbContext())
{
return IncludeRefObjects(context.Set<T>()).Where(filter).ToList();
}
}
...
}
Я не уверен, где добавить инициализатор базы данных. Большинство примеров, которые я нашел, добавляют инициализатор базы данных в global.asax, но это не мой случай, потому что уровень доступа к данным находится в отдельном проекте. Чтобы запустить проект на данный момент, я предложил добавить initalizer здесь:
public class MyDbContext : System.Data.Entity.DbContext
{
public DbSet<User> Users { get; set; }
public DbSet<Company> Companies { get; set; }
...
public MyDbContext()
: base("MyDb")
{
var type = typeof(System.Data.Entity.SqlServer.SqlProviderServices);
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
modelBuilder.Configurations.Add(new CompanyConfig());
modelBuilder.Configurations.Add(new UserConfig());
...
Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyDbContext, Configuration>());
}
Это подходящее место?
Я помещаю его в статический конструктор контекста базы данных. –
Я определяю SetInitializer в OnModelCreating, как вы, и никогда не возникало никаких проблем, поскольку он запускается до инициализации базы данных. –