如何在Entity Framework OnModelCreating中运行查询

时间:2017-11-19 21:37:43

标签: 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);
     }
}

我收到以下错误:

  

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

     

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

1 个答案:

答案 0 :(得分:0)

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

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();
    }
}