2012-10-17 77 views
1

我有套实体的所有的人都从抽象类派生自定义密钥生成在RavenDB

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,所以我不明白我做错了什么?

回答

2

只是猜测,但它可能不是你的密钥生成,但你如何存储它们。

在第一次使用,你可能有这样的:

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

这部分是好的,但在随后的使用,你不应该做同样的事情。相反,它应该更是这样的:

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

注有到.Store()进行更改时没有呼叫。这是因为该实体是由该会话“跟踪”的,并且当您调用.SaveChanges()

+0

时,所有更改都会自动保留,因此如果我从外部源获取实体集并只想刷新持久化实体,我是否应该迭代所有这些,重新分配它们的值然后SaveChanges?另外,如果我让RavenDB为我的实体生成唯一的密钥,我的代码工作得很好,我可以重复这种行为来生成我自己的密钥吗?有什么区别? –

+0

你的确可以做到这一点。如果您有很多文档需要一次更改,则可能需要调查修补API。 http://ravendb.net/docs/client-api/partial-document-updates –

+0

如果你让乌鸦生成独特的ID,并且你存储了一个新的实体,它可能不会抛出你所看到的异常,但你实际上正在存储一个新文件,而不是更新现有文件。完成后会有两个。 –