私のアドバイスは、SaveChanges()
コードを変更しないことです。
RLSを使用する推奨される方法は、TenantId
カラムをEFモデルとコードに対して透過的にすることです。エンティティにテナントIDまたはナビゲーションプロパティを定義する必要はありません。この方法でSaveChanges()
コードを変更する必要はなく、コード内でDB接続を開くときに明示的に管理してSubscription_Id
の値を設定する必要はありません。
データベースのSubscription_Id
列にデフォルト値の制約を手動で設定する必要があります。現在のセッションのデフォルト値はSubscription_Id
です。この値はレコードを挿入するときに設定され、暗黙的にデータベースレベルで後続のクエリとコマンドをフィルタリングするために使用されます。既存の列の場合は
ALTER TABLE SomeEntityTable ADD Subscription_Id nvarchar(128)
DEFAULT CAST(SESSION_CONTEXT(N'UserId') AS nvarchar(128))
:新しい列の場合
ALTER TABLE SomeEntityTable
ADD DEFAULT CAST(SESSION_CONTEXT(N'UserId') AS nvarchar(128)
FOR Subscription_Id
列が前回異なるDEFAULT
値を持っていた場合、また、その関連を削除するには良いでしょう廃止されたDEFAULT
制約。既存の列のデフォルト値を更新する詳細については、hereを参照してください。
これらの列をモデルに含めないでください。エンティティクラスにそれらのプロパティを持つべきではありません。 Database Firstを使用している場合は、データベースからモデルを更新する際に、これらの列を除外/無視する必要があります。
EFコードを使用している場合の方法最初に、コードをAdd-Migration
で生成した後に、AlterColumn
(またはCreateColumn
)の手順をコードの移行に手動で含めることができます。すべてのエンティティテーブルのためにそれを実行します(。また、列を削除Down()
メソッドを追加してもいいでしょう)
public override void Up()
{
AlterColumn("dbo.SomeEntityTable", "Subscription_Id",
c => c.String(
nullable: false,
maxLength: 128,
defaultValueSql: "CAST(SESSION_CONTEXT(N'UserId') AS nvarchar(128))"));
}
が
警告:この移行を実行するときには、すでに既存のレコードを持っている場合は注意が必要空のSubscription_Id
カラム値を持つテーブル(またはすでにレコードがあるテーブルに新しいSubscription_Id
カラムを追加する場合)を使用します。空の列には、移行を実行している接続のSubscription_Id
の値が入力されます。おそらく間違っています(既存のレコードをすべてその特定のサブスクリプションに関連付けることは望ましくありません)。その場合は、の値をUp()
メソッドにSql()
メソッドで明示的に含めることができます。このような何か:
Sql("UPDATE SomeEntitiesTable SET Subscription_Id= '19bc9b0d-28dd-4510-bd5e-d6b6d445f511' WHERE Id IN (1, 2, 5)");
コードファーストではまた、あなたのモデルクラスからSubscription_Id
プロパティを削除する必要があります。できない場合は、少なくともSubscription_Id
列の設定コードに明示的なIgnore()
命令を追加すると、EFマッピングにそれらの命令を入れたくありません。
注:私はあなたがSESSION_CONTEXT
でUserId
パラメータを使用して、あなたのDBにおけるRLSポリシーを作成したことを、ここで仮定している、とDB接続を開くときに、アプリケーション・コードがDbConnectionInterceptor
または類似した何かを経由して、その値を設定していること。
This page詳細情報が含まれています。
なぜSubscription_Idを変更または上書きしたいのですか?それは私が考えるプライマリ/ユニークなキーです。 –
サブスクリプションIDがないので、サブスクライバに関連するすべてのデータがサブスクライバIDとともに保存されます。 – Gunashekar
savechanges()でsubscriptionIdの値を設定する理由は何ですか? –