ASP.NET Core OnModelCreating强制在每个请求中触发

时间:2017-01-27 10:12:48

标签: c# sql-server asp.net-core-mvc entity-framework-core

ASP.NET Core OnModel创建在每个请求中触发的强制

我有ASP.NET Core(1.1.0)和SQL Server数据库。在登录页面中,我有一个表格,其中包含一个名称为公司的选择框。

例如:

  • 公司1
  • 公司2

如果用户选择第一个“公司1”,我需要使用公司前缀重命名所有表格:

protected override void OnModelCreating(ModelBuilder builder)
{
    base.OnModelCreating(builder);

    foreach (var entity in builder.Model.GetEntityTypes())
    {
       entity.Relational().TableName = "Company 1" + entity.DisplayName();
    }
}

它工作得非常好,但问题是当用户选择错误的公司,或退出系统并使用其他公司重新登录时,OnModelCreating永远不会再次调用,我无法重新配置dbContext。

是否可以为每个请求强制使用OnModelCreating?

或者在dbContext启动后更改表名?

谢谢!

1 个答案:

答案 0 :(得分:0)

这是错误的方式。 EF在您的类中创建/描述模型时运行OnModelCreating。这里有很多反射和类型操作,包括验证关系,与真实DB进行比较(并检查是否需要迁移)等等。你真的需要在每个请求上运行所有这些东西???

不要为每个请求重新创建DbContext。创建几个DbContexts并在请求开始时选择其中一个(创建一次!)。

例如:

制作主DbContext摘要,并根据需要创建尽可能多的CompanyXDbContext。它们都应该从基类继承,为它提供简单的表前缀(在ctor中)。

代码中的任何地方,当您需要DbContext时,请求DI中的抽象/基类。

Startup中,使用工厂方法注册抽象DbContext,根据当前Request变量/参数选择真实的,或编写基于当前请求创建正确实例的自定义中间件。

如果您有很多CompanyX,那么您可能需要其他东西而不是许多预先编码的CompanyXDbContext类,运行时类创建或可能是泛型...但主要想法仍然没有改变 - 不要再次重新创建模型并在每次请求时再次。