2017-11-01 22 views
0

私はFILESTREAMのブロブを保存する機能を使用したいアプリケーションがあります。私はEF6がFILESTREAMをサポートしていないことを知っていますので、私はファイルと画像の処理を自分で管理します。しかし、私は私のデータベースにFILEGROUPFILEを追加するために自分自身の初期化コードを記述する必要があります: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() 

をしたいが直感的な方法で私のカスタム戦略。これはどうすればできますか?カスタム初期化子内

答えて

0

追加:

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

は、静的コンストラクタの内部あなたの初期化子を呼び出します。これは、一度だけ実行される保証:

public class DatenbankContext : DbContext 
{ 
    static DatenbankContext() 
    { 
     Database.SetInitializer(new CustomDbInitializer()); 
    } 
} 

は、カスタム初期化子の詳細についてはhereを参照してください。プロセスを制御したい場合は、おそらくCreateDatabaseIfNotExistsから継承したくないでしょう。リンクの例を参照してください。

+0

このソリューションの問題は、コンテキストが作成されたときにイニシャライザが呼び出されないことです。これは、データベースを 'context.Table.Add(...)'で「タッチ」すると呼び出されます。それは私のために遅れることです。 –

+0

その後、起動時に 'context.Database.Initialize(true);'を呼び出します。 https://msdn.microsoft.com/en-us/library/system.data.entity.database.initialize(v=vs.113).aspx –

関連する問題