gpt4 book ai didi

c# - ASP.NET Core OnModelCreating 强制触发每个请求

转载 作者:太空宇宙 更新时间:2023-11-03 15:09:18 26 4
gpt4 key购买 nike

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

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

例如:

  • 公司 1
  • 公司 2

如果用户选择第一个“Company 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 初始化后更改表名?

谢谢!

最佳答案

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

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

例如:

使您的主要 DbContext 抽象,并根据需要创建尽可能多的 CompanyXDbContext。它们都应该继承自基类,为其提供简单的表前缀(在 ctor 中)。

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

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


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

关于c# - ASP.NET Core OnModelCreating 强制触发每个请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41891493/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com