实体框架:如何对待 dbo.tablename 与 obd.tablename 不同

本文关键字:tablename dbo obd 不同 框架 实体 | 更新日期: 2023-09-27 18:32:00

我有针对MyDatabase运行的website1和webiste2。

在我的数据库中,我有一些表:dbo。用户,dbo1。帖子,dbo2。职位。dbo之间有一个外键关系船。用户和 dbo1。帖子和 dbo。用户和 dbo2。职位。

我希望网站 1

和网站 2 运行相同的代码库,是否有可能让网站 1 从 dbo1 获取它的帖子。帖子,而网站 2 从 dbo2 获取他们的帖子。职位?

想法是所需的架构(dbo1 或 dbo2)将来自配置文件。

在我的情况下,dbo1 中的信息。帖子和 dbo2。帖子可被视为机密。可能有用户可能有权访问两者,或者可能有用户有权访问一个。因此,在我看来,有两种方法,在物理上或逻辑上分离数据库。我手头的任务是调查它是否可以合乎逻辑地完成

实体框架:如何对待 dbo.tablename 与 obd.tablename 不同

此链接说明如何使用代码优先映射为类指定架构。如果你不能重构你的应用程序,不在两个不同的模式中使用相同的类/表,恐怕你必须定义两个 Post 类:映射到 dbo1 的 Post1 和映射到 dbo2 的 Post2。此外,在尝试为用户获取帖子时,您会遇到阻抗,您必须拥有User.Post1s和User.Post2s(粗略的例子,抱歉)。

因此,除非您别无选择,否则我会重构它以解决重复的表。

六步:

  1. 使用类型库导入程序为 ActiveX EXE 生成互操作程序集。
  2. 在 C# 项目中添加对互操作程序集的引用。
  3. 使用 Process.Start 启动 ActiveX EXE。
  4. 使用 Marshal.GetActiveObject 获取正在运行的 ActiveX EXE 中对象的运行实例(等于 VB 中的 GetObject)。
  5. 将上一步中返回的对象强制转换为互操作程序集中定义的等效类型。
  6. 对对象做任何需要做的事情。

老实说,我会重新评估您的设计,并在 Post 表中添加一列指示来源。更简单,更干净。

好的,这就是最终发生的事情。 仍然不确定这是否是最好的解决方案,但如果有人来寻找这个问题的答案,我确实找到了一种方法来让它工作。

话虽如此,我仍然同意Matt和Hacked的观点,应该有一种更简单的方法来做到这一点。

我的谜题有三种不同的图片。

首先,有一个用于相关

实体表的映射,其中我使用了以下内容:

this.ToTable("Posts", ConfigurationHelper.GetSiteSchema());

其次,我在配置帮助程序中有一行,该行从 Web.config 文件中的应用程序设置读取

    public static string GetSiteSchema()
    {
        return ConfigurationManager.AppSettings["SiteSchema"];
    }

在web.config文件中的第三个中,我添加了一个应用程序设置,如下所示:

 <appSettings>
    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="true" />
    <add key="SiteSchema" value="dbo1"/>
  </appSettings> 

构建应用程序并运行它后,我从 dbo1 获得帖子。职位。 然后,我可以将 web.config 文件中的字符串切换到"dbo2",刷新页面并查看来自 dbo2 的帖子。职位。

如果要在创建上下文时动态设置架构名称,这里有另一种解决方案...基本上类似于@BradleyH的答案,但不是从配置类中读取,而是将模式名称作为映射方法/构造函数的参数。

有关更详细的说明,请参阅此处:https://stackoverflow.com/a/14782001/243607