Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架6中的DbContext和数据库初始化器_C#_Asp.net Mvc_Entity Framework - Fatal编程技术网

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;