2017-08-11 16 views
0

次のコードでは、Idを知らずにデータベースから取得することなく、エンティティのプロパティの1つに要素を追加するにはどうすればよいですか?既知の主キーを持たないエンティティを更新する

public async Task BookInPersonVisitAsync(Guid propertyId, DateTime dateTime, CancellationToken token) 
    { 
     var entity = new OnBoardingProcessEntity{ ExternalId = propertyId }; 

     DbContext.OnBoardingProcesses.Attach(entity); 

     entity.OnBoardingProcessVisits.Add(new OnBoardingProcessVisitEntity 
     { 
      DateTime = dateTime, 
      Occurred = false 
     }); 

     await DbContext.SaveChangesAsync(token); 
    } 

ExternalIdは外部参照に使用するguidです。これはIDのセットを持っていないが、データベースを打つことなく私たちはそれを持っていない原因でdoesntの仕事。

答えて

0

エンティティフレームワークでは、別のエンティティ(entity)からエンティティ(referencedEntity)を参照する必要がある場合は、referencedEntityを知る必要があります。
それ以外の場合は、referencedEntityをnullに設定したエンティティを追加するだけで追加できます。
referencedEntityを知っているか、Idを知っているか、データベースから何らかの方法で取得する必要があります。

ExternalIdがNULLキーの候補キーである場合、SQL(DML)では、OnBoardingProcessVisitレコードを1回の往復で挿入できますが、挿入ステートメントには内部クエリが含まれます。

OnBoardingProcessVisit.OnBoardingProcess_Id = (
    SELECT 
     Id 
    FROM 
     OnBoardingProcess 
    WHERE 
     ExternalId = @propertyId) 

EDIT
EFと、そのクエリを生成する方法はありません。あなたは外部コンポーネント(自由で自由ではない、例えばEntityFramework Extendedなど)を見ることができますが、この場合は役に立たないと思います。

この場合、おそらく標準エンティティフレームワークの機能を使用しようとします(ExternalIdからOnBoardingProcessを取得するために1回の往復)。
次に、ラウンドトリップが遅すぎる場合は、データベースで直接SQLクエリを実行します。
パフォーマンス(およびデータベースの整合性)については、OnBoardingProcess.ExternalId(いずれの場合も)にユニークなインデックスを追加してください。

往復を決定した場合はもう1つの提案。 コードではentityがプロキシになります。遅延ロードを無効にしない場合は、コード entity.OnBoardingProcessVisits(ステートメントentity.OnBoardingProcessVisits.Add)にアクセスするときに、もう一度ラウンドトリップします。
この場合、遅延読み込みを無効にするか、別の方法で同じことを実行します。
あなたのケースでは、別の方法が何かある

var onBoardingProcessVisitEntity new OnBoardingProcessVisitEntity 
{ 
    DateTime = dateTime, 
    Occurred = false, 
    OnBoardingProcess = entity 
}); 

DbContext.OnBoardingProcessVisits.Add(onBoardingProcessVisitEntity); 
await DbContext.SaveChangesAsync(token); 
+0

はあなたの入力をありがとうございましたように、事は、どのように私はEFはちょうどあなたの例のようにスクリプトを生成作るのですか?今では、外部IDが候補キーであることをEFで言うことができます。 – Marco

+0

答えの編集セクションを参照 – bubi

+0

私はちょうどHasAlternateKeyをEFの最新バージョンで使うことができると思われます:(お手伝いをありがとう。 – Marco

関連する問題