目的: Id、RecordId、EntityType、およびその他のいくつかの列を含む Publication というテーブルがあります。そのテーブルから別のデータベースに公開する必要があるすべてのレコードを選択します。次に、そのコレクションをループしてレコードを処理し、レコードを他のデータベースに移動します。
背景: EntityType 列は、コンテキストが取得する必要があるセットを識別するために使用されます。また、リフレクションを使用してその型のオブジェクトを作成し、それが特定の型のインターフェイスを実装しているかどうかを確認します。処理中のレコードがそのインターフェイスを実装している場合、Publication テーブル内のそのレコードの RecordId は Set() 内の PK ではなく、FK であることがわかります。
このコードは、特定のインターフェイスを継承しない EntityTypes の PK 値を追跡するときに問題なく動作します。
object authoringRecordVersion = PublishingFactory.AuthoringContext.Set(recordType.Entity.GetType()).Find(record.RecordId);
問題:
DbContext.Set(EntityType).Find(PK) は PrimaryKey 値の後に続きます。「場所」が許可されていないため、このsudoコード例のように検索するようにSet()に指示するにはどうすればよいですか
object authoringRecordVersion = PublishingFactory.AuthoringContext.Set(recordType.Entity.GetType()).Where(c => c.HeaderRecordId == record.RecordId)
アップデート:
以下の実装に取り組んでいます。明日結果報告します
var sql = "SELECT * from " + record.Entity + " WHERE HeaderRecordId = '" + record.RecordId + "'";
authoringRecordVersion = PublishingFactory.AuthoringContext.Set(recordType.Entity.GetType()).SqlQuery(sql).AsNoTracking();