5

次のようなモデルで RavenDB を使用しています。

public class Cart {
    List<Item> Items = new List<Item>();
}

public class Item {
    public Cart Cart;
}

を に追加するItemCart、関係の両側が接続されます。

RavenDB はこれをどのようにシリアライズおよびデシリアライズしますか? リファレンスCartは自動的に割り当てられますか、それともロード時に手動で配線する方法はありますか?

4

2 に答える 2

9

カートを保存すると、 を呼び出したときに「自己参照ループが検出されました...」という例外が発生しますSaveChanges()

修正は簡単です。[JsonObject(IsReference = true)]属性をカートに追加します。これにより、シリアライザーはアイテムのカートを新しいオブジェクトとしてではなく参照として保存するように指示されます。

[JsonObject(IsReference = true)] 
public class Cart
{
    public List<Item> Items = new List<Item>();
}

public class Item
{
    public Cart Cart;
}

また、デシリアライズされたプロパティであることにも言及したいと思います。つまり、アイテムがロードされると、カートはアイテムに再割り当てされます。

var cart = new Cart();
cart.Items.Add(new Item { Cart = cart });
session.Store(cart);
session.SaveChanges();

...

var cart = session.Query<Cart>().First();
Assert.ReferenceEquals(cart, cart.Items.First().Cart); //this works
于 2012-04-09T14:27:27.687 に答える
0

これらのシナリオで RavenDB がどのように機能するかを理解するには、おそらくこれを読んでください: http://ravendb.net/docs/theory/document-structure-design

この場合、Item と Card は実際には同じドキュメントにシリアル化されますが、これは望ましくない可能性があります。RavenDBの参照には、ドキュメント自体ではなく、参照ドキュメントの IDのみを含める必要があります。

于 2012-04-09T06:28:10.063 に答える