2

概要

私は現在、ユーザー (データベース1に格納されている) が異なるテナント (テナントごとにデータベースに格納されている(同じ db スキーマ) に格納されている) に登録できる (非常に単純な?) マルチテナント Web アプリケーションのプロトタイプを作成しています。多くのマルチテナント ソリューションに適用されます。

残念ながら、Entity Framework ではクロス データベース リレーションがサポートされていないことがわかりました (EF6 ではまだサポートされていると思います)。以下のリンクを提供しました。

次の短いセクションでは、私の問題と、最終的には私の質問について説明します。

設計の背後にある合理性

私は別々のデータベースを持つことにしました。ユーザー (1) 用に 1 つと、顧客固有の情報を含む各テナント用に 1 つ。こうすることで、ユーザーは別のテナントに参加するときに新しいアカウントを作成する必要がなくなります (1 人の顧客が部門ごとに異なるドメインを持つことができます)。

実装方法

DbContextこれは、ユーザー用とテナント情報用の2 つの異なる を使用して実装しました。で、エンティティ (ナビゲーション プロパティ)を参照するエンティティを保持するTenantContextを定義します。DbSetUser

「テナントごと」のコンテキスト:

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
}

さて、何がうまくいかないのですか?

期待される:

私が(まったく愚かなことに)それが起こると思ったのは、実際にデータベース間の関係を作成することです。

「テナントごと」のデータベースには、テーブル「ケース」が含まれています。このテーブルには、'UserID' を持つ行が含まれています。「UserID」は「Users」データベースを参照します。

実際:

s の追加を開始すると、「テナントごと」のデータベースに別のテーブル「Users」Caseも作成されます。私の「ケース」テーブルでは、同じデータベース内のテーブルを参照しています。UserID

データベース間の関係は EF に存在しません

それでグーグルを始めたところ、この機能は単にサポートされていないことがわかりました。このようなアプリケーションに EF を使用する必要があるのでしょうか? 代わりにNHibernateに移行する必要がありますか?

しかし、マルチ テナント アプリケーションの巨大な市場が、Microsoft の Entity Framework によって単純に無視されているとは想像もできません。だから私はおそらくかなりばかげたことをしています。

最後に、質問...

主な質問は、私の「データベース設計」に関するものだと思います。私は EF を初めて使用し、学習しながら学習しているため、何度か間違った方向に進んだ可能性があります (設計が壊れているのでしょうか?)。SO は EF の専門家によく知られているため、同じことを達成するためにどの代替手段を使用できるか (マルチテナント、共有ユーザー、Azure で展開可能) を学びたいと思っています。単一のアプリケーションを使用しても、共有データベースDbContextを使用してマルチテナント Web アプリケーションを展開できる必要がありますか?Users

よろしくお願いします。


学んだこと:


  • PS: これは長い質問だと思います。読みやすさを向上させるために、質問を自由に編集し、無関係な部分を削除してください。
  • PPS: 必要に応じてさらに多くのコードを共有できます

よろしくお願いします。あなたのすべての努力に賛成票を投じて喜んで報います!

4

1 に答える 1

1

データベース間の関係が必要な理由がまったくわかりません。アプリケーションが 2 つのデータベース (ユーザー データベースとテナント データベース) と通信できると仮定すると、最初のデータベースを認証に簡単に使用して、"名前による" 規則を使用してテナント データベースで関連するユーザーを見つけることができます。

たとえば、ユーザー データベースを使用してユーザー JOHN を認証する場合は、テナント データベースでユーザー JOHN を検索します。

これは実装がはるかに簡単で、要件にも適合します。ユーザーはパスワードとユーザー レコードの "シャドウ コピー" と共にユーザー データベースに格納されますが、テナント データベースにはパスワードが格納されず、これら 2 つの間に物理的な関係はありません。

于 2013-03-02T23:33:58.400 に答える