Entity framework 如何在ModelCreating上的实体框架中运行查询

Entity framework 如何在ModelCreating上的实体框架中运行查询,entity-framework,Entity Framework,您知道如何在模型创建中运行查询吗 我试图运行一个查询,然后基于该查询忽略实体中的一列 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'table

您知道如何在模型创建中运行查询吗

我试图运行一个查询,然后基于该查询忽略实体中的一列

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);
     }
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
var d=this.Database.SqlQuery(@“从sys.columns中选择1,其中Name=N'columnname'和Object\u ID=Object\u ID(N'tablename'))”)。SingleOrDefault();
如果(d==null)
{
忽略(d=>d.colmnname);
}
}
我得到以下错误:

创建模型时无法使用上下文。如果上下文在OnModelCreating方法内使用,或者如果多个线程同时访问同一上下文实例,则可能引发此异常。注意,DbContext和相关类的实例成员不能保证是线程安全的。(有关详细信息,请参见内部异常。)

System.InvalidOperationException:在创建模型时无法使用上下文。如果上下文在OnModelCreating方法内使用,或者如果多个线程同时访问同一上下文实例,则可能引发此异常。注意,DbContext和相关类的实例成员不能保证是线程安全的


我认为这两种情况都应该有两个上下文类。并且应在工厂内调用您的查询,以选择应返回哪个实例的类:

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();
    }
}
公共类CommonContext:DbContext
{
//普通的东西。。。
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
//普通的东西。。。
}
}
公共类IgnoreContext:CommonContext
{
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
基于模型创建(modelBuilder);
modelBuilder.Entity().Ignore(d=>d.colmnname);
}
}
公共上下文工厂()
{
公共CommonContext CreateContext()
{
var ctx=new CommonContext();
var d=ctx.Database.SqlQuery(@“从sys.columns中选择1,其中Name=N'columnname'和Object\u ID=Object\u ID(N'tablename'))”)。SingleOrDefault();
如果(d!=null)
返回ctx;
返回新的IgnoreContext();
}
}

我认为两种情况下都应该有两个上下文类。并且应在工厂内调用您的查询,以选择应返回哪个实例的类:

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();
    }
}
公共类CommonContext:DbContext
{
//普通的东西。。。
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
//普通的东西。。。
}
}
公共类IgnoreContext:CommonContext
{
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
基于模型创建(modelBuilder);
modelBuilder.Entity().Ignore(d=>d.colmnname);
}
}
公共上下文工厂()
{
公共CommonContext CreateContext()
{
var ctx=new CommonContext();
var d=ctx.Database.SqlQuery(@“从sys.columns中选择1,其中Name=N'columnname'和Object\u ID=Object\u ID(N'tablename'))”)。SingleOrDefault();
如果(d!=null)
返回ctx;
返回新的IgnoreContext();
}
}

创建模型时,上下文的哪一部分不能使用,您不明白吗?错误消息清楚地表明:在创建模型时(在整个
OnModelCreating
方法中),不能使用上下文。在创建模型时不能使用上下文的哪一部分您不明白吗?错误消息清楚地表明:在创建模型时(在整个
OnModelCreating
方法中),不能使用上下文。当应用程序总是需要
IgnoreContext
s时,这是非常昂贵的。当应用程序总是需要
IgnoreContext
s时,这是非常昂贵的。