2017-11-19 18 views
0

OnModelCreatingでクエリを実行する方法はありますか?Entity Frameworkでクエリを実行する方法OnModelCreating

私はクエリを実行し、それに基づいてエンティティの列を無視しようとしています。

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    var d = this.Database.SqlQuery<int?>(@"select 1 from sys.columns where Name = N'columnname' and Object_ID = Object_ID(N'tablename')").SingleOrDefault(); 

    if(d == null) 
    { 
     depEntity.Ignore(d => d.colmnname); 
    } 
} 

私は、次のエラーを取得しています:

The context cannot be used while the model is being created. This exception may be thrown if the context is used inside the OnModelCreating method or if the same context instance is accessed by multiple threads concurrently. Note that instance members of DbContext and related classes are not guaranteed to be thread safe. (See inner exception for details.)

System.InvalidOperationException: The context cannot be used while the model is being created. This exception may be thrown if the context is used inside the OnModelCreating method or if the same context instance is accessed by multiple threads concurrently. Note that instance members of DbContext and related classes are not guaranteed to be thread safe.

+2

コンテキスト**の部分は、あなたが理解していない**使用できませんか?エラーメッセージには、モデルが作成されている間(全体の 'OnModelCreating'メソッド内で)、コンテキスト**を使用することはできません**。 –

答えて

0

私はあなたが両方のケースのための2つのコンテキストクラスを持つべきだと思います。そして、あなたのクエリは、インスタンスが返されるのクラスを選択する工場の内側に起動する必要があります:モデルが作成されている間、

public class CommonContext : DbContext 
{ 
    //common stuff... 
    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     //common stuff... 
    } 
} 

public class IgnoreContext : CommonContext 
{ 
    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     base.OnModelCreating(modelBuilder); 
     modelBuilder.Entity<DepEntity>().Ignore(d => d.colmnname); 
    } 
} 

public ContextFactory() 
{ 
    public CommonContext CreateContext() 
    { 
     var ctx = new CommonContext(); 
     var d = ctx.Database.SqlQuery<int?>(@"select 1 from sys.columns where Name = N'columnname' and Object_ID = Object_ID(N'tablename')").SingleOrDefault(); 
     if(d != null) 
      return ctx;    
     return new IgnoreContext(); 
    } 
} 
+0

アプリケーションが常に 'IgnoreContext'を必要とする場合、これはかなり高価です。 –

関連する問題