EF6更改数据库创建策略

时间:2017-11-01 15:54:40

标签: c# entity-framework-6

我有一个应用程序,我想使用 FILESTREAM 功能来存储blob。我知道EF6不支持 FILESTREAM ,所以我将自己管理文件和图像处理。但是,我必须编写自己的初始化代码,以便将 FILEGROUP FILE 添加到我的数据库中,并且:

public class CustomDbInitializer : CreateDatabaseIfNotExists<DatenbankContext>
{   
    public override void InitializeDatabase(DatenbankContext context)
    {
        base.InitializeDatabase(context);
        SqlConnectionStringBuilder b = new SqlConnectionStringBuilder(context.Database.Connection.ConnectionString);
        context.Database.ExecuteSqlCommand(TransactionalBehavior.DoNotEnsureTransaction,"ALTER DATABASE "+ b.InitialCatalog + " ADD FILEGROUP GRP CONTAINS FILESTREAM");
        //more sql commands
    }
}

然后,我手动调用函数 InitializeDatabase(context)

new CustomDbInitializer().InitializeDatabase(context);

然而,我发现这有点笨拙且反直觉。我知道我可以在构造函数中为上下文设置初始值设定项,但这不符合我的要求:

public class DatenbankContext : DbContext
{
    public DatenbankContext()
        :base("name=name")
    {
        Database.SetInitializer(new CustomDbInitializer());
    }
}

基本上,我想要电话

new DatenbankContext() // or
context.Database.CreateIfNotExists()

以直观的方式使用我的自定义策略初始化我的数据库。怎么办呢?

1 个答案:

答案 0 :(得分:0)

在自定义初始值设定项中添加:

var $modalContent = new Foundation.Reveal($('#modalContent'));
$modalContent.open();

在静态构造函数中调用初始化程序。这确保它只运行一次:

if (!context.Database.Exists())
{
    context.Database.Create();
}
// Do next steps

有关自定义初始值设定项的详情,请参阅here。如果您想要控制该过程,您可能不想继承public class DatenbankContext : DbContext { static DatenbankContext() { Database.SetInitializer(new CustomDbInitializer()); } } 。请参阅链接中的示例。