C# 实体框架6中的DbContext和数据库初始化器
在哪里打电话合适C# 实体框架6中的DbContext和数据库初始化器,c#,asp.net-mvc,entity-framework,C#,Asp.net Mvc,Entity Framework,在哪里打电话合适 Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyDbContext, Configuration>());? 我还有Configuration类和Seed方法 internal sealed class Configuration : DbMigrationsConfiguration<MyDbContext> { publ
Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyDbContext, Configuration>());?
我还有Configuration
类和Seed
方法
internal sealed class Configuration : DbMigrationsConfiguration<MyDbContext>
{
public Configuration()
{
AutomaticMigrationsEnabled = false;
}
protected override void Seed(Eedez.Dal.DbContext.EedezDbContext context)
{
// running seeds
}
}
我不确定在哪里添加数据库初始值设定项。我发现的大多数示例都将数据库初始值设定项添加到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>());
}
公共类MyDbContext:System.Data.Entity.DbContext
{
公共数据库集用户{get;set;}
公共数据库集公司{get;set;}
...
公共MyDbContext()
:base(“MyDb”)
{
var type=typeof(System.Data.Entity.SqlServer.SqlProviderServices);
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove();
modelBuilder.Configurations.Add(newcompanyconfig());
modelBuilder.Configurations.Add(newuserconfig());
...
SetInitializer(新的MigrateDatabaseToLatestVersion());
}
这是正确的位置吗?在
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);
}
// ..
}
公共类MyDbContext:System.Data.Entity.DbContext
{
静态MyDbContext()
{
SetInitializer(新的MigrateDatabaseToLatestVersion());
}
//你的其他代码
公共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;
var configInitializer=typeof(MigrateDatabaseToLatestVersion);
并将此值粘贴到databaseInitializer元素的type属性上。我将其放置在数据库上下文的静态构造函数中。我在OnModelCreating中定义SetInitializer,就像您示例中一样,在数据库初始化之前运行时从未遇到过任何问题。我希望在DataAccess层而不是web.config中进行配置(web应用层)。数据访问层是独立的项目。
<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;