实体框架中的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
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);
}
// ..
}
我通常更喜欢在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;