2016-08-17 9 views
0

このソリューションのすべてのアプリケーションで使用されるアプリケーションのコアプロジェクトで、ドロップをして設定を再作成しました。私のモデルは、アプリケーションプールをリサイクルするたびに、このドロップが必要な場所とデータベーステーブルを再作成するのに十分なほど大きく変更されています(アプリケーションはすぐに急速に開発されています)。2つ以上のプロジェクトが同時に開始されると、お互いにステップを落として再作成し、欠けているテーブルが何度もあることがあります。セカンダリアプリでのEFモデル作成の防止

実行時に、条件に基づいてモデルを作成しないようにする方法が必要です。私は試しました:

しかし、これは動作していません...テーブルはまだ作成されています。これどうやってするの?

+0

あなたはアプリケーションのリサイクルごとにデータベースを削除して再作成しますか? ! – DavidG

+0

私は英語でそれを書いていませんでしたか?はい、私たちは開発の「急速な変化」段階にあります。 –

+0

あなたはそれが開発であるとは言わなかった、それは狂った生産であることを暗示した。 – DavidG

答えて

1

かなりわかりません。

開発目的で、テーブルに異なるスキーマを使用できます。

protected override void OnModelCreating(ModelBuilder modelBuilder) 
{ 
    modelBuilder.HasDefaultSchema("applicationX"); 
} 

これが不可能な場合は、エンティティの接尾辞/接頭辞テーブル名を付けることができます。

両方のアプリケーションで共有テーブル(データ)が必要な場合は、同じモデル構築コードを共有するすべてのアプリケーションですべてのデータベースを作成できます。

もちろん、あなたのデータベースレクリエーションコード(https://github.com/aspnet/EntityFramework/issues/3042)の "クリティカルセクション"を何らかの方法で作成し、ミューテックスまたは/およびそれを組み合わせて使用​​する必要があります。データベース内に独自のロック同期オブジェクト(テーブル)があります。

あなたが動的モデル(データベース)を構築する必要がある場合は、例えば、単一のDBコンテキストに動的モデルを構築するために依存性の注入を使用します。もちろん

/// <summary> 
/// Formalization of entity framework DbContext model creation <see cref="DbContext.OnModelCreating"/> 
/// </summary> 
/// <remarks> 
/// The reason for this explicit interface of the <see cref="DbContext.OnModelCreating"/> is to make compositions of several model builders into one 
/// </remarks> 
public interface IEntityFrameworkModelBuilder 
{ 
    void BuildModel(ModelBuilder modelBuilder); 
} 

public abstract class DbContextBase : DbContext 
{ 

    protected DbContextBase(DbContextOptions options, IEntityFrameworkModelBuilder modelBuilder) : base(options) 
    { 
     _modelBuilder = modelBuilder; 
    } 

    public virtual IEntityFrameworkModelBuilder ModelBuilder 
    { 
     get { return _modelBuilder ?? (_modelBuilder = new DefaultSchemaEntityFrameworkModelBuilder("dbo")); } 
     protected set { _modelBuilder = value; } 
    } 

    protected override void OnModelCreating(ModelBuilder modelBuilder) 
    { 
     base.OnModelCreating(modelBuilder); 
     ModelBuilder.BuildModel(modelBuilder); 
    } 
} 

を、あなたは、例えば作成することができますあなたのIEntityFrameworkModelBuilder用コンポジットパターンクラス:

/// <summary> 
/// The composition of <see cref="IEntityFrameworkModelBuilder"/> used to construct <see cref="DbContext"/> model creation from several modules (tests). 
/// </summary> 
/// <seealso cref="DbContextOnModelCreatingAdaptingModelBuilder"/> 
public class EntityFrameworkModelBuilderComposition : IEntityFrameworkModelBuilder, IList<IEntityFrameworkModelBuilder> 
{ 
    private readonly IList<IEntityFrameworkModelBuilder> _builders; 

    public EntityFrameworkModelBuilderComposition() : this(new IEntityFrameworkModelBuilder[0]) 
    {} 

    public EntityFrameworkModelBuilderComposition(params IEntityFrameworkModelBuilder[] builders) 
    { 
     _builders = new List<IEntityFrameworkModelBuilder>(builders); 
    } 

    /// <summary> 
    /// Constructor to take list of builders as underlaying list so it is initialized with these builders and sharing the same reference. 
    /// </summary> 
    /// <param name="builders"></param> 
    public EntityFrameworkModelBuilderComposition(IList<IEntityFrameworkModelBuilder> builders) 
    { 
     _builders = builders ?? new List<IEntityFrameworkModelBuilder>(); 
    } 

    public virtual void BuildModel(ModelBuilder modelBuilder) 
    { 
     foreach (var b in _builders) 
     { 
      b.BuildModel(modelBuilder); 
     } 
    } 
} 

はちょうどあなたが、遅かれ早かれ有用見つけることができるものを、追加:もちろん

/// <summary> 
/// The <see cref="IEntityFrameworkModelBuilder"/> implementation of a building model on the base of <see cref="DbContext"/> instance calling its <see cref="DbContext.OnModelCreating"/> protected method. 
/// </summary> 
/// <seealso cref="DbContextOnModelCreatingAdaptingModelBuilder"/> 
/// <seealso cref="EntityFrameworkModelBuilderComposition"/> 
public class DbContextOnModelCreatingAdaptingModelBuilder : IEntityFrameworkModelBuilder 
{ 
    private readonly Func<DbContext> _dbContextFactoryMethod; 

    public DbContextOnModelCreatingAdaptingModelBuilder(Func<DbContext> dbContextFactoryMethod) 
    { 
     _dbContextFactoryMethod = dbContextFactoryMethod; 
    } 

    public void BuildModel(ModelBuilder modelBuilder) 
    { 
     using (var dbContext = _dbContextFactoryMethod()) 
     { 
      MethodInfo onModelCreating = dbContext.GetType().GetMethod("OnModelCreating", BindingFlags.NonPublic | BindingFlags.Instance); 
      onModelCreating.Invoke(dbContext, new object[] {modelBuilder}); 
     } 
    } 
} 

、すべての上記のポイントは/目的の動作を取得するために結合されなければならないことができます。しかし、それは正確に

ドロップに関して何を意味するのか

私のモデルは、私はこのドロップを必要と

を再現した場所に十分有意に変化し、あなたがモデルの違いを評価するか、はっきりしていないとお互いにステップを作り直してください。何度もテーブルが欠けています

+0

動的モデル作成のもう一つの追加ポイント - ModelCustomizer:https://github.com/aspnet/EntityFramework/issues/5866 –

関連する問題