私は、共同SQLServerデータベースで数千の小規模な顧客をホストするaspxアプリケーションを作成しています。すべてのエンティティは、Linq-To-Sqlを介して作成およびロードされます。
代理キー(ID列)はすべてのテーブル関係のスキーマ全体で使用されるため、ルートカスタマーオブジェクトから始めて、通常のLinqクエリ(SQL結合)を使用して特定のカスタマーの排他的なデータセットに移動できるはずです。
ただし、セキュリティの観点から、上記は少し壊れやすいので、セキュリティのバックストップとしてテナンシーチェックのレイヤーを追加したいと思います。私のエンティティモデルのすべてのエンティティには、インデックス付けされていないintTenantIdフィールドがあります。
パフォーマンスの観点から、このソリューションに関する批判的なコメントを探しています。
public partial class MyLinqEntity
partial void OnLoaded() // linq-to-sql extensibility function
{
if ( this.TennantId != HttpContext.Current.Session["tenantId"] )
throw new ApplicationException("Logic error, LINQ query crossed tenantId data boundary");
}
partial void OnCreated() // linq-to-sql extensibility function
{
this.TennantId = HttpContext.Current.Session["tenantId"] );
}