私は asp.net プロジェクトで Breeze を使用しています。
別のエンティティ (linkedTransports) を含むエンティティ (トランスポート) があります。
ユーザーがトランスポートのlinkedTransportsを追加/削除できるページがあります。ユーザーが特定のlinkedTransportの削除ボタンをクリックすると、削除済みとしてマークされますが、これは を呼び出すときにのみ実際に削除されdatacontext.saveChanges();
ます。ユーザーは引き続きキャンセルを押してから、 を呼び出しますdatacontext.cancelChanges()
。
各 linkedTransport は一意である必要があります。つまり、要素 123 を 2 倍追加することはできません。
ユーザーがlinkedTransportを追加しようとするたびに、すべてのlinkedTransportsをループして、これがまだ存在しないかどうかを確認します。ほとんどのシナリオでは、かなりうまく機能します。
私の問題:以下のケースに問題があります:
- 要素123を削除しました
- (削除は saveChanges までコミットされません)
- 要素123を追加
要素が削除されているため (実際には setDeleted ですが、サーバー側ではコミットされていません)、クライアント側で彼の存在を検出できず、キーが既に存在するため追加がエラーになります。
私の言いたいことがわかると思います。
ユーザーが追加できるようにする前に、すべてのlinkedTransports(削除されていても)をループして、すでに存在するかどうかを確認する方法はありますか?
ここに私のクラスがあります:
public class Transport
{
[Key]
public int Id { get; set; }
...
public virtual List<LinkedTransport> LinkedTransports { get; set; }
}
public class LinkedTransport
{
[Key, Column(Order = 0)]
public int TransportId { get; set; }
[Key, Column(Order = 1)]
public int TransportRelatedId { get; set; }
public virtual Transport Transport { get; set; }
public virtual Transport TransportRelated { get; set; }
}
これまでのところ、要素が既に存在するかどうかを確認するために行うことは次のとおりです。
// don't accept if selected element is already present
for (var i = transport().linkedTransports().length - 1; i >= 0 ; i--) {
if (transport().linkedTransports()[i].transportRelatedId() == transpRelatedId) {
alert('Already present!');
return false;
}
};
// if we go so far then we can create the linkedTransport safely
ctxTransport.createLinkedTransport(transpId, transpRelatedId, transpNumber);
ありがとう。