概要
私は現在、ユーザー (データベース1に格納されている) が異なるテナント (テナントごとにデータベースに格納されている(同じ db スキーマ) に格納されている) に登録できる (非常に単純な?) マルチテナント Web アプリケーションのプロトタイプを作成しています。多くのマルチテナント ソリューションに適用されます。
残念ながら、Entity Framework ではクロス データベース リレーションがサポートされていないことがわかりました (EF6 ではまだサポートされていると思います)。以下のリンクを提供しました。
次の短いセクションでは、私の問題と、最終的には私の質問について説明します。
設計の背後にある合理性
私は別々のデータベースを持つことにしました。ユーザー (1) 用に 1 つと、顧客固有の情報を含む各テナント用に 1 つ。こうすることで、ユーザーは別のテナントに参加するときに新しいアカウントを作成する必要がなくなります (1 人の顧客が部門ごとに異なるドメインを持つことができます)。
実装方法
DbContext
これは、ユーザー用とテナント情報用の2 つの異なる を使用して実装しました。で、エンティティ (ナビゲーション プロパティ)を参照するエンティティを保持するTenantContext
を定義します。DbSet
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
}
さて、何がうまくいかないのですか?
期待される:
私が(まったく愚かなことに)それが起こると思ったのは、実際にデータベース間の関係を作成することです。
「テナントごと」のデータベースには、テーブル「ケース」が含まれています。このテーブルには、'UserID' を持つ行が含まれています。「UserID」は「Users」データベースを参照します。
実際:
s の追加を開始すると、「テナントごと」のデータベースに別のテーブル「Users」Case
も作成されます。私の「ケース」テーブルでは、同じデータベース内のテーブルを参照しています。UserID
データベース間の関係は EF に存在しません
それでグーグルを始めたところ、この機能は単にサポートされていないことがわかりました。このようなアプリケーションに EF を使用する必要があるのでしょうか? 代わりにNHibernateに移行する必要がありますか?
しかし、マルチ テナント アプリケーションの巨大な市場が、Microsoft の Entity Framework によって単純に無視されているとは想像もできません。だから私はおそらくかなりばかげたことをしています。
最後に、質問...
主な質問は、私の「データベース設計」に関するものだと思います。私は EF を初めて使用し、学習しながら学習しているため、何度か間違った方向に進んだ可能性があります (設計が壊れているのでしょうか?)。SO は EF の専門家によく知られているため、同じことを達成するためにどの代替手段を使用できるか (マルチテナント、共有ユーザー、Azure で展開可能) を学びたいと思っています。単一のアプリケーションを使用しても、共有データベースDbContext
を使用してマルチテナント Web アプリケーションを展開できる必要がありますか?Users
よろしくお願いします。
学んだこと:
- NHibernate はデータベース間の関係をサポートしています (ただし、Azure にデプロイし、Microsoft テクノロジに固執したいと考えています)
- ビューまたはシノミムが代替手段になる可能性があります (それが Azure でより多くの問題を引き起こすかどうかは不明です)
- データベース間の関係は EF ではサポートされていません。
- PS: これは長い質問だと思います。読みやすさを向上させるために、質問を自由に編集し、無関係な部分を削除してください。
- PPS: 必要に応じてさらに多くのコードを共有できます
よろしくお願いします。あなたのすべての努力に賛成票を投じて喜んで報います!