Entity Framework Core 中动态更改架构

2023-12-01

UPD here这是我解决问题的方法。尽管它可能不是最好的,但它对我有用。


我在使用 EF Core 时遇到问题。我想通过模式机制在项目数据库中分离不同公司的数据。我的问题是如何在运行时更改架构名称?我找到了类似的问题关于这个问题,但它仍然没有答案,而且我有一些不同的条件。所以我有Resolve必要时授予数据库上下文的方法

public static void Resolve(IServiceCollection services) {
    services.AddIdentity<ApplicationUser, IdentityRole>()
        .AddEntityFrameworkStores<DomainDbContext>()
        .AddDefaultTokenProviders();
    services.AddTransient<IOrderProvider, OrderProvider>();
    ...
}

我可以在中设置模式名称OnModelCreating,但是,正如之前所发现的,该方法仅被调用一次,因此我可以像这样全局设置模式名称

protected override void OnModelCreating(ModelBuilder modelBuilder) {
    modelBuilder.HasDefaultSchema("public");
    base.OnModelCreating(modelBuilder);
}

或者通过属性直接在模型中

[Table("order", Schema = "public")]
public class Order{...}

但是如何在运行时更改模式名称?我为每个请求创建上下文,但首先我通过对数据库中架构共享表的请求来计算出用户的架构名称。那么组织该机制的正确方法是什么:

  1. 通过用户凭据找出架构名称;
  2. 从特定模式的数据库中获取用户特定的数据。

谢谢。

附:我使用 PostgreSql,这就是使用小写表名的原因。


您是否已在 EF6 中使用 EntityTypeConfiguration?

我认为解决方案是在 DbContext 类中的 OnModelCreating 方法上使用实体映射,如下所示:

using System;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Conventions.Internal;
using Microsoft.Extensions.Options;

namespace AdventureWorksAPI.Models
{
    public class AdventureWorksDbContext : Microsoft.EntityFrameworkCore.DbContext
    {
        public AdventureWorksDbContext(IOptions<AppSettings> appSettings)
        {
            ConnectionString = appSettings.Value.ConnectionString;
        }

        public String ConnectionString { get; }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseSqlServer(ConnectionString);

            // this block forces map method invoke for each instance
            var builder = new ModelBuilder(new CoreConventionSetBuilder().CreateConventionSet());

            OnModelCreating(builder);

            optionsBuilder.UseModel(builder.Model);
        }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.MapProduct();

            base.OnModelCreating(modelBuilder);
        }
    }
}

OnConfiguring 方法上的代码强制在 DbContext 类的每个实例创建上执行 MapProduct。

MapProduct方法的定义:

using System;
using Microsoft.EntityFrameworkCore;

namespace AdventureWorksAPI.Models
{
    public static class ProductMap
    {
        public static ModelBuilder MapProduct(this ModelBuilder modelBuilder, String schema)
        {
            var entity = modelBuilder.Entity<Product>();

            entity.ToTable("Product", schema);

            entity.HasKey(p => new { p.ProductID });

            entity.Property(p => p.ProductID).UseSqlServerIdentityColumn();

            return modelBuilder;
        }
    }
}

正如您在上面看到的,有一行用于设置表的架构和名称,您可以为 DbContext 中的一个构造函数发送架构名称或类似的内容。

请不要使用魔术字符串,您可以创建一个包含所有可用模式的类,例如:

using System;

public class Schemas
{
    public const String HumanResources = "HumanResources";
    public const String Production = "Production";
    public const String Sales = "Sales";
}

要使用特定模式创建 DbContext,您可以编写以下内容:

var humanResourcesDbContext = new AdventureWorksDbContext(Schemas.HumanResources);

var productionDbContext = new AdventureWorksDbContext(Schemas.Production);

显然,您应该根据模式的名称参数的值来设置模式名称:

entity.ToTable("Product", schemaName);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Entity Framework Core 中动态更改架构 的相关文章

  • 结构化绑定中缺少类型信息

    我刚刚了解了 C 中的结构化绑定 但有一件事我不喜欢 auto x y some func is that auto正在隐藏类型x and y 我得抬头看看some func的声明来了解类型x and y 或者 我可以写 T1 x T2 y
  • 如何将 std::string& 转换为 C# 引用字符串

    我正在尝试将 C 函数转换为std string参考C 我的 API 如下所示 void GetStringDemo std string str 理想情况下 我希望在 C 中看到类似的东西 void GetStringDemoWrap r
  • 调用 McAfee 病毒扫描引擎

    我收到客户的请求 要求使用他们服务器上的 McAfee 病毒扫描将病毒扫描集成到应用程序中 我做了一些调查 发现 McScan32 dll 是主要的扫描引擎 它导出各种看起来有用的函数 我还发现提到了 McAfee Scan Engine
  • STL 迭代器:前缀增量更快? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中的预增量比后增量快 正确吗 如果是 为什么呢 https stackoverflow com questions 2020184 preincrement faster than postinc
  • 在 xaml 中编写嵌套类型时出现设计时错误

    我创建了一个用户控件 它接受枚举类型并将该枚举的值分配给该用户控件中的 ComboBox 控件 很简单 我在数据模板中使用此用户控件 当出现嵌套类型时 问题就来了 我使用这个符号来指定 EnumType x Type myNamespace
  • 如何连接重叠的圆圈?

    我想在视觉上连接两个重叠的圆圈 以便 becomes 我已经有部分圆的方法 但现在我需要知道每个圆的重叠角度有多大 但我不知道该怎么做 有人有主意吗 Phi ArcTan Sqrt 4 R 2 d 2 d HTH Edit 对于两个不同的半
  • 用于 FTP 的文件系统观察器

    我怎样才能实现FileSystemWatcherFTP 位置 在 C 中 这个想法是 每当 FTP 位置添加任何内容时 我都希望将其复制到我的本地计算机 任何想法都会有所帮助 这是我之前问题的后续使用 NET 进行选择性 FTP 下载 ht
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • 如何获取 EF 中与组合(键/值)列表匹配的记录?

    我有一个数据库表 其中包含每个用户 年份组合的记录 如何使用 EF 和用户 ID 年份组合列表从数据库获取数据 组合示例 UserId Year 1 2015 1 2016 1 2018 12 2016 12 2019 3 2015 91
  • 如何定义一个可结构化绑定的对象的概念?

    我想定义一个concept可以检测类型是否T can be 结构化绑定 or not template
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • 为什么 isnormal() 说一个值是正常的,而实际上不是?

    include
  • 有没有办法让 doxygen 自动处理未记录的 C 代码?

    通常它会忽略未记录的 C 文件 但我想测试 Callgraph 功能 例如 您知道在不更改 C 文件的情况下解决此问题的方法吗 设置变量EXTRACT ALL YES在你的 Doxyfile 中
  • C++ 继承的内存布局

    如果我有两个类 一个类继承另一个类 并且子类仅包含函数 那么这两个类的内存布局是否相同 e g class Base int a b c class Derived public Base only functions 我读过编译器无法对数
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现
  • 类型或命名空间“MyNamespace”不存在等

    我有通常的类型或命名空间名称不存在错误 除了我引用了程序集 using 语句没有显示为不正确 并且我引用的类是公共的 事实上 我在不同的解决方案中引用并使用相同的程序集来执行相同的操作 并且效果很好 顺便说一句 这是VS2010 有人有什么

随机推荐

  • 将动态数量的项目划分为列

    我有动态数量的项目 需要将其中分成几列 假设我得到了这个 array one two three four five six seven eight 我需要生成这个 ul li one li li two li li three li li
  • JBOSS 7.1.1 中 DLL 的路径设置

    我们有一些与以下相关的 DLLJava VB In Joss 4 X 我们以前是放在Application Server下的bin目录下的 我们迁移到JBOSS 7 1 1当我从 bin 目录中删除并将它们放入库文件夹中时C jboss a
  • 如何将 Stripe Connect 与 Node.js 集成?

    因此 我现在处于您登录 Stripe 帐户的部分 完成后它会将您重定向到我的网站 我不知道下一步该做什么 而且文档也很难理解 因为我没有任何 Node js 经验 我只需要一些关于该怎么做的指导 单击 授权 按钮后 在您的重定向 URI 处
  • 获取 Android 麦克风的分贝

    我已经搜索了一段时间了 但一直没能找到一种方法来实际从 Android 上的麦克风获取 SPL db 值 我发现讨论它的少数线程和文章将其视为某种东西so显然 任何人都应该能够做到这一点 并且更关心的是让他们的转换算法正确 有谁知道如何做到
  • Python 套接字:gethostbyaddr:反向 DNS 查找失败

    我在使用时获取主机名时遇到问题socket gethostbyaddr ip addr 在特定网站上 我不会详细说明这不适用于哪个网站 因此 按名称获取主机对于到目前为止我尝试过的每个网站都可以正常工作 但是当我尝试从中获取网站名称时 我收
  • 从 iPhone 应用程序传输 MP3 的最佳方式?

    我正在开发一个应用程序 它将通过 iPhone 应用程序从我的服务器传输音乐 这是我的第一个 iPhone 应用程序 所以我有点困惑 最好的办法是什么 这 是否已经内置了一些东西 我可以使用它 就像 MP3 播放器一样 我只需要指向 正确的
  • TypeScript 返回以泛型形式构造的对象

    我想定义以下通用函数来处理从接口类型到实现该接口的类类型的转换 考虑以下接口 类对 interface IExample num number class Example implements IExample num number 基本上
  • Spotfire 从计算列中查找值

    我在 Spotfire 中有一个数据集 我正在其中创建一个返回实体名称的计算列 返回的实体名称也在 A 列中 从计算列返回实体名称后 我需要一个位于不同列但位于实体名称行上的数据属性 我附上了数据快照 计算字段返回 公司 C 我需要创建一个
  • 实体框架仅返回一个值,但列表大小正确

    实体框架仅返回一个值 但列表大小正确 我有一个没有主 ID 的表 我需要获取或选择其中的所有值 我看到的是 当我使用 linq 进行选择时 对象的数量是正确的 但它一遍又一遍地是第一行 我只是在做这样的事情 List
  • 回溯如何与标记一起使用?

    我在互联网上进行了搜索 但找不到关于回填如何工作的正确解释 您能解释一下回溯是如何工作的吗 它如何与markers 我知道它有两种主要类型的标记 其中有下一个四边形 其中包含下一个列表 I found 这段代码 其中他们获取输入文件并使用
  • Shiny:通过单击 valueBox 触发弹出窗口

    我想通过单击在弹出窗口中显示数据表valueBox The valueBox本身应该作为actionButton 当我点击valueBox它应该在弹出窗口中呈现一个表格 如下图所示 任何人都可以帮忙解决这个代码吗 My code libra
  • 如何从 Auth::attempt() 检索更具体的错误

    我对 laravels Auth attempt 有一次奇怪的经历 我为用户制作了一个注册页面 一切正常 您可以 sign up 确认电邮 sign in etc 现在奇怪的部分是 Auth attempt 对于任何数据输入都可以正常工作
  • 如何停止Spring的默认输出?

    我是春天的新手 当我运行 Spring 批处理应用程序时 我期望只看到 Hello World 但相反 我得到以下附加详细信息 May 03 2012 12 28 42 PM org springframework context supp
  • 如何将关闭按钮添加到 UIModalPresentationFormSheet 中呈现的模态视图角?

    我想在某个角落添加一个浮动关闭 x 按钮UIModalPresentationPageSheet看法 效果如下 但是将其添加到父视图会使其显示在页面表后面 并且也无法点击 并将其添加到页面表将使其部分隐藏 因为它超出了视图区域 还有更好的解
  • Javascript:如何找到第一个重复值并返回其索引?

    我必须在数组中找到第一个重复值 然后在变量firstIndex 中返回其索引 这必须通过 for 循环来完成 for 循环应该在找到第一个重复项后停止 我知道这可能很简单 但我被困住了 到目前为止我已经有了这个 但它似乎不起作用 var n
  • SSL密钥交换加密技术[关闭]

    Closed 这个问题是无关 目前不接受答案 匿名 DH 临时 DH 和固定 DH 三种密钥交换算法有何区别 From 思科的文档 固定迪菲 赫尔曼 这是 Diffie Hellman 密钥交换 其中 服务器的证书包含 Diffie Hel
  • 从 UILabel Swift 中获取 Int

    我遇到的问题是 有大量以数字作为标签的按钮 所以我想我可以将标签视为整数 而不是为每个按钮创建一个操作 IBAction func NumberInput sender UIButton var input Int sender title
  • 使用 Foundation 6 的中间人

    我想将 Middleman 与出色的 Foundation 6 一起使用 Here是我在 Middleman 网站上找到的一个存储库 我安装了 Middleman 以及 Xcode 开发人员工具 当我跑步时middleman init T
  • 如何在android中的服务中调用振动器

    我正在尝试运行vibrator如果从我的应用程序调用服务 我将从Fragment但我不知道为什么振动器在服务内不起作用 我什至无法打印Toast 我的代码 从片段调用 Intent buzz new Intent getActivity L
  • Entity Framework Core 中动态更改架构

    UPD here这是我解决问题的方法 尽管它可能不是最好的 但它对我有用 我在使用 EF Core 时遇到问题 我想通过模式机制在项目数据库中分离不同公司的数据 我的问题是如何在运行时更改架构名称 我找到了类似的问题关于这个问题 但它仍然没