ASP.NET Core OnModel创建在每个请求中触发的强制
我有ASP.NET Core(1.1.0)和SQL Server数据库。在登录页面中,我有一个表格,其中包含一个名称为公司的选择框。
例如:
如果用户选择第一个“公司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启动后更改表名?
谢谢!
答案 0 :(得分:0)
这是错误的方式。 EF在您的类中创建/描述模型时运行OnModelCreating
。这里有很多反射和类型操作,包括验证关系,与真实DB进行比较(并检查是否需要迁移)等等。你真的需要在每个请求上运行所有这些东西???
不要为每个请求重新创建DbContext。创建几个DbContexts并在请求开始时选择其中一个(创建一次!)。
例如:
制作主DbContext摘要,并根据需要创建尽可能多的CompanyXDbContext。它们都应该从基类继承,为它提供简单的表前缀(在ctor中)。
代码中的任何地方,当您需要DbContext时,请求DI中的抽象/基类。
在Startup
中,使用工厂方法注册抽象DbContext,根据当前Request
变量/参数选择真实的,或编写基于当前请求创建正确实例的自定义中间件。
如果您有很多CompanyX,那么您可能需要其他东西而不是许多预先编码的CompanyXDbContext类,运行时类创建或可能是泛型...但主要想法仍然没有改变 - 不要再次重新创建模型并在每次请求时再次。