Summary
我目前正在制作一个(非常简单?)多租户 Web 应用程序的原型,其中用户(存储在数据库中)1)可以注册到不同的租户(存储在数据库中per租户(相同的数据库模式)。我认为这种架构适用于许多多租户解决方案。
遗憾的是,我发现实体框架不支持跨数据库关系(我认为 EF6 仍然如此)。我提供了下面的链接。
接下来的一小部分解释了我的问题,并最终解释了我的问题。
设计背后的理性
我选择拥有单独的数据库;一份用于用户 (1),一份用于每个租户及其客户特定信息。这样,用户在加入另一个租户时不必创建新帐户(一个客户可以为不同部门拥有不同的域)。
它是如何实施的
我使用两种不同的方式实现了这个DbContext
s,一项用于用户,一项用于租户信息。在里面TenantContext
我定义DbSet
s 包含引用的实体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:如果需要,我可以分享更多代码
预先非常感谢您。我很乐意为您的所有努力投上赞成票来奖励您!