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 回答