私はFILESTREAMのブロブを保存する機能を使用したいアプリケーションがあります。私はEF6がFILESTREAMをサポートしていないことを知っていますので、私はファイルと画像の処理を自分で管理します。しかし、私は私のデータベースにFILEGROUPとFILEを追加するために自分自身の初期化コードを記述する必要があります:EF6データベースの作成方法を変更
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(コンテキスト)
new CustomDbInitializer().InitializeDatabase(context);
呼び出します
しかし、私はこれはちょっとしたと反直感的な見つける。私は、コンストラクタでのコンテキストの初期化を設定することができることを知っているが、これは私が望むように動作しません:
public class DatenbankContext : DbContext
{
public DatenbankContext()
:base("name=name")
{
Database.SetInitializer(new CustomDbInitializer());
}
}
は基本的に、私は私のデータベースを初期化するために呼び出し
new DatenbankContext() // or
context.Database.CreateIfNotExists()
をしたいが直感的な方法で私のカスタム戦略。これはどうすればできますか?カスタム初期化子内
このソリューションの問題は、コンテキストが作成されたときにイニシャライザが呼び出されないことです。これは、データベースを 'context.Table.Add(...)'で「タッチ」すると呼び出されます。それは私のために遅れることです。 –
その後、起動時に 'context.Database.Initialize(true);'を呼び出します。 https://msdn.microsoft.com/en-us/library/system.data.entity.database.initialize(v=vs.113).aspx –