即使对于新的上下文,OnModelCreating 也只调用一次

Nei*_*ker 5 c# entity-framework entity-framework-6

我有多个相同但内容不同的 SQL 服务器表。在编写代码第一个 EF6 程序时,我试图为每个程序重用相同的 db 上下文并将表名传递给上下文构造函数。

然而,虽然每次都调用构造函数,但 OnModelCreating 方法只被调用一次,尽管每次都从 new 创建 db 上下文。我该如何重置?

我曾尝试使用 AsNoTracking 并且我阅读了禁用 ModelCaching 的内容,但无法找到如何执行此操作或这是否是最佳方法。MSDN 甚至说“可以通过在给定的 ModelBuidler[sic] 上设置 ModelCaching 属性来禁用这种缓存”,但它不存在。

这是我的数据库上下文:

public partial class MissingContext : DbContext
{
    private string tableName = "";
    public MissingContext(string tableName) : base("name=MissingContext")
    {
        this.tableName = tableName;
    }

    public virtual DbSet<MissingData> MissingDataSet { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<MissingData>()
           .ToTable(this.tableName);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我使用它的代码:

List<MissingData> missingData=null;
string[] inputTables="TABLEA;TABLEB;TABLEC".Split(';');
foreach (string table in inputTables)
{
    logger.Info($"Processing {table}");
    missingData = null;

    MissingContext db = new MissingContext(table);
    var query = from d in db.MissingDataSet.AsNoTracking()
                select d;
    missingData = query.ToList();
}
Run Code Online (Sandbox Code Playgroud)

在运行时,表始终具有正确的 TABLEA、TABLEB、TABLEC 并将其传递给 db 上下文构造函数,但是 OnModelCreating 仅针对第一个循环项调用一次,因此查询对象生成的 SQL 始终从 TABLEA 中选择:

SELECT 
[Extent1].[id] AS [id], 
[Extent1].[OrganisationName] AS [OrganisationName] 
FROM [dbo].[**TABLEA**] AS [Extent1]
Run Code Online (Sandbox Code Playgroud)

*抱歉,如果任何代码看起来有误,我会重命名一些变量,因为它们是业务敏感的。

Rud*_*ppa 5

OnModelCreating仅会被调用一次,这是默认行为。

根据OnModelCreating文档。

通常,仅在创建派生上下文的第一个实例时调用此方法一次。然后,该上下文的模型将被缓存,并且适用于应用程序域中该上下文的所有其他实例。可以通过在给定 ModelBuidler 上设置 ModelCaching 属性来禁用此缓存,但请注意,这会严重降低性能。通过直接使用 DbModelBuilder 和 DbContextFactory 类提供对缓存的更多控制。