1

私はエンティティのセットを持っていますそれらはすべて抽象クラスから派生しています

public abstract class NamedEntity : INamedEntity
{
    #region Public Properties

    public string Description { get; set; }

    public string Id { get; set; }

    public string Name { get; set; }

    #endregion
}

Nameすべてのエンティティを永続化するとき、フィールドをキーとして使用したいので、そのDocumentKeyGeneratorような実装をオーバーライドして提供します。

    store.Conventions.DocumentKeyGenerator = entity =>
        {
            var namedEntity = entity as NamedEntity;

            if (namedEntity != null)
            {
                return string.Format("{0}/{1}", store.Conventions.GetTypeTagName(entity.GetType()), namedEntity.Name);
            }

            return string.Format("{0}/", store.Conventions.GetTypeTagName(entity.GetType()));
        };

エンティティのリストを初めて永続化する場合は正常に機能しますが、再度永続化する場合は例外が発生します

PUT attempted on document 'xxxxx' using a non current etag

RavenDBを使い始めたばかりなので、何が間違っているのか理解できませんか?

4

1 に答える 1

2

推測ですが、それはおそらくキーの生成ではなく、それらをどのように保存するかによるものです。

最初の使用では、おそらく次のようなものがあります。

var myEntity = new MyEntity(...);
session.Store(myEntity);
...
session.SaveChanges();

その部分は問題ありませんが、その後の使用では、同じことをするべきではありません。代わりに、次のようになります。

var myEntity = session.Load<MyEntity>("myentities/foobar");
myEntity.Something = 123;
...
session.SaveChanges();

変更を加えるときは、への呼び出しがないことに注意してください.Store()。これは、エンティティがセッションによって「追跡」され、呼び出したときにエンティティへのすべての変更が自動的に保持されるためです。.SaveChanges()

于 2012-10-17T17:09:31.577 に答える