3

データのインポートに使用している ADO.Net Data Service があります。ほとんどのエンティティがリンクしているエンティティが多数あります。インポート中にそれを行うには、最初にこれらのエンティティを作成し、保存してから .SetLink(EntityImport, "NavigationProperty", CreatedEntity) を使用します。ここで最初に遭遇した問題は、コンテキストが CreatedEntity を常に認識しているとは限らないことでした (これは、各エンティティが個別にインポートされ、各アイテムが作成されるときにコンテキストが作成されるためです。この機能を保持したいと思います)。 -つまり、答えとして「1つのコンテキストのみを使用する」ことを避けようとしています)。

したがって、SetLink を呼び出そうとする前に .AddToCreatedEntityType(CreatedEntity) があります。もちろん、これは初めて機能しますが、2 回目のパスで「コンテキストは既にエンティティを追跡しています」というエラー メッセージが表示されます。

コンテキストが既にエンティティを追跡しているかどうかを確認する方法はありますか (context.Contains(CreatedEntity) はまだ実装されていません)。try catch を試みてエラーを回避することを考えていましたが、パスごとに新しい CreatedEntity が作成されるようです。LINQ to Data Services を使用してその CreatedEntity を毎回取得する必要があるように見えますが、それは効率が悪いようです - 何か提案はありますか?

4

2 に答える 2

5

エンティティのEntityStateプロパティを確認する必要があると思います。

値が EntityState.Detached である場合にのみ、コンテキストに追加する必要があります。

次の注意事項を忘れないでください。

この列挙には、メンバー値のビットごとの組み合わせを許可する FlagsAttribute 属性があります。

拡張メソッドを作成します。

public static class EntityObjectExtensions
{
    public static Boolean IsTracked(this EntityObject self)
    {
        return (self.EntityState & EntityState.Detached) != EntityState.Detached;
    }
}
于 2008-10-23T07:09:44.240 に答える
3

コンテキストが更新 (または追加) したいエンティティを追跡しているかどうかを確認しようとすると、context.Entites.Contains(currentItem) が機能しないことがわかり、かなりがっかりしました。

私はそれを回避しました:

if (context.Entities.Where(entities => entities.Entity == currentItem).Any())
{
   this.service.UpdateObject(currentItem);                    
}
于 2008-11-10T05:19:11.543 に答える