gpt4 book ai didi

c# - EF : Database design issues regarding cross database relations

转载 作者:太空宇宙 更新时间:2023-11-03 13:46:27 25 4
gpt4 key购买 nike

概括

我目前正在设计一个(非常简单的?) Multi-Tenancy Web 应用程序的原型(prototype),其中用户(存储在数据库 1 中)可以注册到不同的租户(存储在数据库中 每个 租户(相同的数据库架构)。我认为适用于许多 Multi-Tenancy 解决方案的架构。

遗憾的是,我发现 Entity Framework 不支持跨数据库关系(我认为 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
}
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实体也包含在 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
}

现在,出了什么问题?

预期:

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

“每租户”数据库包含一个表“案例”。此表包含具有“用户 ID”的行。 “用户 ID”指的是“用户”数据库。

实际:

当我开始添加 Case s 我还在“每个租户”数据库中创建另一个表“用户”。在我的“案例”表中, UserID指的是同一个数据库中的表。

EF 中不存在跨数据库关系

所以我开始搜索,发现这个功能根本不支持。这让我想,我什至应该将 EF 用于这样的应用程序吗?我应该改用 NHibernate 吗?

但我也无法想象 巨大的微软的 Entity Framework 根本忽略了 Multi-Tenancy 应用程序的市场?!所以我很可能正在做一些相当愚蠢的事情。

最后,问题...

我认为主要问题是关于我的“数据库设计”。由于我是 EF 的新手并且边走边学,因此我可能有好几次都走错了方向(我的设计有问题吗?)。由于 EF 专家很好地代表了 SO,我非常渴望了解我可以使用哪些替代方案来实现相同的目标( Multi-Tenancy 、共享用户、可在 azure 中部署)。我应该使用一个 DbContext并且仍然能够使用共享的 Users 部署 Multi-Tenancy Web 应用程序数据库?

我真的很感谢你的帮助!

学到的东西:
  • NHibernate 确实支持跨数据库关系(但我想部署到 Azure 并坚持使用微软技术)
  • View 或同义词可以作为替代方案(不确定这是否会在 Azure 中造成更多困难)
  • EF 不支持跨数据库关系:
  • EF4 cross database relationships
  • ADO.Net Entity Framework across multiple databases
  • Entity framework 4 and multiple database
  • (带有 EF 开发人员的 msdn 论坛)http://social.msdn.microsoft.com/Forums/en/adodotnetentityframework/thread/cad06147-2168-4c20-ac23-98f32987b126


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

  • 非常感谢你。我很乐意为您的所有努力点赞!

    最佳答案

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

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

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

    关于c# - EF : Database design issues regarding cross database relations,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15179407/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com