Domanda

I have sets of entities all of them are derived from abstract class

public abstract class NamedEntity : INamedEntity
{
    #region Public Properties

    public string Description { get; set; }

    public string Id { get; set; }

    public string Name { get; set; }

    #endregion
}

When I persist all entities I want to use Name field as a key, so I override DocumentKeyGenerator and provide such implementation:

    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()));
        };

It works fine when I persist the list of entities for the first time, but if I want to persist them again I get an exception

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

I just started using RavenDB, so I cannot understand what I am doing wrong?

È stato utile?

Soluzione

Just a guess, but it's probably not with your key generation, but how you are storing them.

On first usage you probably have something like:

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

That part is fine, but on subsequent usage, you should not be doing the same thing. Instead, it should be more like this:

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

Note there is no call to .Store() when making changes. This is because the entity is "tracked" by the session, and all changes to it are automatically persisted when you call .SaveChanges()

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top