2015-07-27 2 views
1

Где правильное место, чтобы позвонить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>()); 
    } 

Это подходящее место?

+2

Я помещаю его в статический конструктор контекста базы данных. –

+1

Я определяю SetInitializer в OnModelCreating, как вы, и никогда не возникало никаких проблем, поскольку он запускается до инициализации базы данных. –

ответ

2

Установите в статическом конструкторе DbContext s. Этот метод просто вызывает одно время и автоматически перед первым использованием вашего класса.

public class MyDbContext : System.Data.Entity.DbContext 
{ 
    static MyDbContext() 
    { 
     Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyDbContext, Configuration>()); 
    } 

    // your other code 
    public MyDbContext() 
    : base("MyDb") 
    { 
     var type = typeof(System.Data.Entity.SqlServer.SqlProviderServices); 
    } 
    // .. 
} 
0

Я обычно предпочитаю, чтобы настроить базу данных инициализатора в пределах раздела конфигурации EntityFramework на web.config файле, например:

<entityFramework> 
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" /> 
    <contexts> 
     <context type="MyAssembly.Fullname.EedezDbContext, MyAssembly.Fullname"> 
     <databaseInitializer type="System.Data.Entity.MigrateDatabaseToLatestVersion`2[[MyAssembly.Fullname.EedezDbContext, MyAssembly.Fullname], [MyAssembly.Fullname.Configuration, MyAssembly.Fullname ]], EntityFramework" /> 
     </context> 
    </contexts> 
</entityFramework> 

Если вам очень трудно написать полный сборочный тип квалифицированное имя, только ты можете использовать этот код, чтобы получить его:

var configInitializer = typeof (MigrateDatabaseToLatestVersion<EedezDbContext, Configuration>).AssemblyQualifiedName; 

и вставьте это значение в свойство типа databaseInitializer.

+0

Я хочу сделать конфигурацию внутри слоя DataAccess, а не внутри web.config (уровень веб-приложения). DataAccess Layer - отдельный проект. – renathy

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