实体框架中的DbContext和数据库初始化器

本文关键字:数据库 初始化 DbContext 框架 实体 | 更新日期: 2023-09-27 18:04:51

该在哪里调用

Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyDbContext, Configuration>());?

下面是我项目的架构描述。

我有MVC + webAPI项目,其中数据访问层是独立的项目,它使用实体框架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调用实体框架方法对数据进行操作。数据访问器的每个方法都创建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,但这不是我的情况,因为数据访问层是在单独的项目。为了现在运行项目,我在这里添加了初始化器:

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>());
    }

是这个地方吗?

实体框架中的DbContext和数据库初始化器

DbContexts静态构造函数中设置。这个方法只在你第一次使用你的类之前自动调用一次。

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);
    }
    // ..
}

我通常更喜欢在web.config文件的EntityFramework配置部分中配置初始化器数据库,例如:

<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元素的type属性上。