EF:有关跨数据库关系的数据库设计问题

2024-03-10

Summary

我目前正在制作一个(非常简单?)多租户 Web 应用程序的原型,其中用户(存储在数据库中)1)可以注册到不同的租户(存储在数据库中per租户(相同的数据库模式)。我认为这种架构适用于许多多租户解决方案。

遗憾的是,我发现实体框架不支持跨数据库关系(我认为 EF6 仍然如此)。我提供了下面的链接。

接下来的一小部分解释了我的问题,并最终解释了我的问题。

设计背后的理性

我选择拥有单独的数据库;一份用于用户 (1),一份用于每个租户及其客户特定信息。这样,用户在加入另一个租户时不必创建新帐户(一个客户可以为不同部门拥有不同的域)。

它是如何实施的

我使用两种不同的方式实现了这个DbContexts,一项用于用户,一项用于租户信息。在里面TenantContext我定义DbSets 包含引用的实体User实体(导航属性)。

“每个租户”上下文:

public class CaseApplicationContext : DbContext, IDbContext
{
    public DbSet<CaseType> CaseTypes { get; set; } 
    public DbSet<Case> Cases { get; set; }

    // left out some irrelevant code
}

The Case entity:

[Table("Cases")]
public class Case : IEntity
{
    public int Id { get; set; }
    public User Owner { get; set; } // <== the navigation property
    public string Title { get; set; }
    public string Description { get; set; }

    public Case()
    {
        Tasks = new List<Task>();
    }
}

The User entity

[Table("Users")]
public class User : IEntity
{
    public int Id { get; set; }

    public string Name { get; set; }
    public string EmailAddress { get; set; }
    public string Password { get; set; }
}

This User实体也包含在Users我的其他 DbContext 衍生数据库:

public class TenantApplicationContext : DbContext, IDbContext
{
    public DbSet<Tenant> Tenants { get; set; }
    public DbSet<User> Users { get; set; } // <== here it is again

    // left out irrelevant code
}

现在,出了什么问题?

预期的:

我(在我所有的愚蠢中)thought会发生的情况是我实际上会创建一个跨数据库关系:

“每个租户”数据库包含一个表“案例”。该表包含带有“UserID”的行。 “UserID”指的是“Users”数据库。

Actual:

当我开始添加Case我也在创造another我的“每个租户”数据库中的“用户”表。在我的“案例”表中UserID指同一数据库中的表。

EF中不存在跨数据库关系

于是我开始谷歌搜索,发现这个功能根本不支持。这让我思考,对于这样的应用程序我是否应该使用 EF?我应该转向 NHibernate 吗?

但我也无法想象huge多租户应用程序市场根本就被微软的实体框架忽视了?!所以我很可能正在做一些相当愚蠢的事情。

最后,问题...

我认为主要问题是关于我的“数据库设计”。由于我是 EF 的新手,并且不断学习,因此我可能多次走错了方向(我的设计是否损坏了?)。由于 SO 在 EF 专家中得到了很好的代表,我非常渴望了解可以使用哪些替代方案来实现相同的目标(多租户、共享用户、可在 azure 中部署)。我应该使用一个单DbContext并且仍然能够使用共享资源部署多租户 Web 应用程序Users数据库?

我非常感谢你的帮助!


学到的东西:

  • NHibernate确实支持跨数据库关系(但我想部署到Azure中并且坚持使用微软技术)
  • 视图或同义词可以作为替代方案(不确定这是否会在 Azure 中造成更多困难)
  • Cross database relations are not supported by EF:
    • EF4 跨数据库关系 https://stackoverflow.com/questions/2723917/ef4-cross-database-relationships
    • 跨多个数据库的 ADO.Net 实体框架 https://stackoverflow.com/questions/610197/ado-net-entity-framework-across-multiple-databases
    • 实体框架4和多数据库 https://stackoverflow.com/questions/2659942/entity-framework-4-and-multiple-database/2788108
    • (EF 开发者的 msdn 论坛)http://social.msdn.microsoft.com/Forums/en/adodotnetentityframework/thread/cad06147-2168-4c20-ac23-98f32987b126 http://social.msdn.microsoft.com/Forums/en/adodotnetentityframework/thread/cad06147-2168-4c20-ac23-98f32987b126

  • PS:我意识到这是一个很长的问题。请随意编辑问题并删除不相关的部分以提高可读性。
  • PPS:如果需要,我可以分享更多代码

预先非常感谢您。我很乐意为您的所有努力投上赞成票来奖励您!


我不太明白为什么你需要跨数据库关系。假设您的应用程序可以与两个数据库(用户数据库和租户数据库)进行通信,它可以轻松地使用第一个数据库进行身份验证,然后按照“按名称”约定在租户数据库中查找相关用户。

例如,如果您使用用户数据库对用户 JOHN 进行身份验证,则您可以在租户数据库中搜索用户 JOHN。

这会更容易实现并且仍然符合您的要求,用户及其密码和用户记录的“卷影副本”一起存储在用户数据库中,但没有密码存储在租户数据库中,并且这两者之间没有物理关系。

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

EF:有关跨数据库关系的数据库设计问题 的相关文章

  • C++ 中的软(不是:弱)引用 - 这可能吗?有实施吗?

    在 C 中我正在使用boost shared ptr and boost weak ptr自动删除不再需要的对象 我知道这些与引用计数一起工作 在 Java 中 内存由垃圾收集器管理 它将内置对象引用视为strong WeakReferen
  • 将处理后的图形绘制到另一个图形中

    我想将一个经过处理的图形绘制到另一个图形中 I have two graphics var gHead Graphics FromImage h var gBackground Graphics FromImage b Transform
  • MEX 文件中的断言导致 Matlab 崩溃

    我正在使用mxAssert 宏定义为matrix h在我的 C 代码中 mex 可以完美编译 当我调用的 mex 代码中违反断言时 该断言不会导致我的程序崩溃 而是导致 Matlab 本身崩溃 我错过了什么吗 这是有意的行为吗 当我查看 M
  • 获取两个字符串之间的公共部分c# [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我需要的是获取两个单词之间的共同部分并获取差异 例子 场景1 word1 感言 word2 Test 将返回 公共部分Test 不同之
  • 在 OpenCL 中将函数作为参数传递

    是否可以在 OpenCL 1 2 中将函数指针传递给内核 我知道可以用C实现 但不知道如何在OpenCL的C中实现 编辑 我想做这篇文章中描述的同样的事情 在 C 中如何将函数作为参数传递 https stackoverflow com q
  • 捕获 foreach 条件中抛出的异常

    我有一个foreach在 foreach 本身的条件下循环期间中断的循环 有没有办法try catch抛出异常然后继续循环的项 这将运行几次 直到异常发生然后结束 try foreach b in bees exception is in
  • std::map 和二叉搜索树

    我读过 std map 是使用二叉搜索树数据结构实现的 BST 是一种顺序数据结构 类似于数组中的元素 它将元素存储在 BST 节点中并按其顺序维护元素 例如如果元素小于节点 则将其存储在节点的左侧 如果元素大于节点 则将其存储在节点的右侧
  • TextBox 焦点的 WinForms 事件?

    我想添加一个偶数TextBox当它有焦点时 我知道我可以用一个简单的方法来做到这一点textbox1 Focus并检查布尔值 但我不想那样做 我想这样做 this tGID Focus new System EventHandler thi
  • ZLIB 解压缩

    我编写了一个小型应用程序 该应用程序应该解压缩以 gzip deflate 格式编码的数据 为了实现这一点 我使用 ZLIB 库 使用解压缩功能 问题是这个功能不起作用 换句话说 数据不是未压缩的 我在这里发布代码 int decompre
  • Xamarin Android:获取内存中的所有进程

    有没有办法读取所有进程 而不仅仅是正在运行的进程 如果我对 Android 的理解正确的话 一次只有一个进程在运行 其他所有进程都被冻结 后台进程被忽略 您可以使用以下代码片段获取当前正在运行的所有 Android 应用程序进程 Activ
  • 单元测试失败,异常代码为 c0000005

    我正在尝试使用本机单元测试项目在 Visual Studios 2012 中创建单元测试 这是我的测试 TEST METHOD CalculationsRoundTests int result Calculations Round 1 0
  • 范围和临时初始化列表

    我试图将我认为是纯右值的内容传递到范围适配器闭包对象中 除非我将名称绑定到初始值设定项列表并使其成为左值 否则它不会编译 这里发生了什么 include
  • C# 创建数组的数组

    我正在尝试创建一个将使用重复数据的数组数组 如下所示 int list1 new int 4 1 2 3 4 int list2 new int 4 5 6 7 8 int list3 new int 4 1 3 2 1 int list4
  • 用于从字符串安全转换的辅助函数

    回到 VB6 我编写了一些函数 让我在编码时无需关心字符串的 null 和 数字的 null 和 0 等之间的区别 编码时 没有什么比添加特殊情况更能降低我的工作效率了用于处理可能导致一些不相关错误的数据的代码 9999 10000 如果我
  • std::bind 重载解析

    下面的代码工作正常 include
  • 32位PPC rlwinm指令

    我在理解上有点困难rlwinmPPC 汇编指令 旋转左字立即然后与掩码 我正在尝试反转函数的这一部分 rlwinm r3 r3 0 28 28 我已经知道什么了r3 is r3在本例中是一个 4 字节整数 但我不确定这条指令到底是什么rlw
  • 如何检测 C# 中该字典键是否存在?

    我正在使用 Exchange Web 服务托管 API 和联系人数据 我有以下代码 即功能性的 但并不理想 foreach Contact c in contactList string openItemUrl https service
  • 如何查明CONFIG_FANOTIFY_ACCESS_PERMISSIONS是否启用?

    我想利用fanotify 7 http man7 org linux man pages man7 fanotify 7 html我遇到的问题是在某些内核上CONFIG FANOTIFY ACCESS PERMISSIONS不起作用 虽然C
  • 热重载时调用方法

    我正在使用 Visual Studio 2022 和 C 制作游戏 我想知道当您热重新加载应用程序 当它正在运行时 时是否可以触发一些代码 我基本上有 2 个名为 UnloadLevel 和 LoadLevel 的方法 我想在热重载时执行它
  • 在基类集合上调用派生方法

    我有一个名为 A 的抽象类 以及实现 A 的其他类 B C D E 我的派生类持有不同类型的值 我还有一个 A 对象的列表 abstract class A class B class A public int val get privat

随机推荐