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)
*抱歉,如果任何代码看起来有误,我会重命名一些变量,因为它们是业务敏感的。
OnModelCreating仅会被调用一次,这是默认行为。
根据OnModelCreating文档。
通常,仅在创建派生上下文的第一个实例时调用此方法一次。然后,该上下文的模型将被缓存,并且适用于应用程序域中该上下文的所有其他实例。可以通过在给定 ModelBuidler 上设置 ModelCaching 属性来禁用此缓存,但请注意,这会严重降低性能。通过直接使用 DbModelBuilder 和 DbContextFactory 类提供对缓存的更多控制。
| 归档时间: |
|
| 查看次数: |
1967 次 |
| 最近记录: |