EF:关于跨数据库关系的数据库设计问题
本文关键字:数据库 问题 关系 于跨 EF | 更新日期: 2023-09-27 18:01:58
摘要
我目前正在制作一个(非常直接?(多租户web应用程序的原型,其中用户(存储在数据库1中(可以注册到不同的租户(存储在每个租户的数据库中(相同的数据库模式((。我认为这个体系结构可以应用于许多多租户解决方案。
遗憾的是,我发现实体框架中不支持跨数据库关系(我认为EF6仍然是这样(。我提供了以下链接。
接下来的简短部分将解释我的问题,并最终解释我的一些问题。
设计背后的理性
我选择有单独的数据库;一个用于用户(1(,一个用于每个租户及其客户特定信息。这样,用户在加入另一个租户时就不必创建新帐户(一个客户可以为不同的部门拥有不同的域(。
如何实施
我使用两个不同的DbContext
实现了这一点,一个用于用户,另一个用于租户信息。在TenantContext
中,我定义了包含引用User
实体的实体(导航属性(的DbSet
。
"每个租户"上下文:
public class CaseApplicationContext : DbContext, IDbContext
{
public DbSet<CaseType> CaseTypes { get; set; }
public DbSet<Case> Cases { get; set; }
// left out some irrelevant code
}
Case
实体:
[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>();
}
}
User
实体
[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; }
}
这个User
实体也由我的另一个DbContext派生:包含在Users
数据库中
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
}
现在,出了什么问题
预期:
我(愚蠢地(认为会发生的事情是,我实际上会创建一个跨数据库关系:
"每个租户"数据库包含一个表"案例"。此表包含具有"UserID"的行。"UserID"指的是"Users"数据库。
实际:
当我开始添加Case
时,我还在"每个租户"数据库中创建另一个表"Users"。在我的"案例"表中,UserID
指的是同一数据库中的表。
EF中不存在跨数据库关系
所以我开始在谷歌上搜索,发现这个功能根本不受支持。这让我思考,对于这样的应用程序,我是否应该使用EF?我应该改为去NHibernate吗?
但我也无法想象微软的实体框架会忽视多租户应用程序的巨大市场?!所以我很可能在做一些相当愚蠢的事情。
最后,问题
我认为主要的问题是关于我的"数据库设计"。由于我是英孚的新手,并且边学习边学习,我可能在几个场合走错了方向(我的设计坏了吗?(。由于SO在EF专家中有很好的代表性,我非常渴望了解我可以使用哪些替代方案来实现同样的目标(多租户、共享用户、可在azure中部署(。我应该使用一个单独的DbContext
,并且仍然能够部署具有共享Users
数据库的多租户web应用程序吗?
我真的很感谢你的帮助!
学到的东西:
- NHibernate确实支持跨数据库关系(但我想部署到Azure中,而更倾向于使用微软技术(
- 视图或Synomyms可以是一种替代方案(不确定这是否会在Azure中造成更多困难(
- EF不支持跨数据库关系:
- EF4跨数据库关系
- 跨多个数据库的ADO.Net实体框架
- 实体框架4和多个数据库
- (与EF开发者的msdn论坛(http://social.msdn.microsoft.com/Forums/en/adodotnetentityframework/thread/cad06147-2168-4c20-ac23-98f32987b126
- 附言:我知道这是一个很长的问题。请随意编辑问题并删除不相关的部分,以提高可读性
- PPS:如果需要,我可以共享更多代码
事先非常感谢。我很乐意为你的所有努力提供支持票!
我不太明白为什么需要跨数据库关系。假设您的应用程序可以与用户数据库和租户数据库这两个数据库进行对话,那么它可以很容易地使用第一个数据库进行身份验证,然后使用"按名称"约定在租户数据库中找到相关用户。
例如,如果您使用用户数据库对用户JOHN进行身份验证,那么您将在租户数据库中搜索用户JOHN。
这将更容易实现,并且仍然符合您的要求,用户与他们的密码和用户记录的"影子副本"一起存储在用户数据库中,但没有密码的情况下,它们存储在租户数据库中,这两者之间没有物理关系。