2

在 RavenDb 中存储我的对象时出现以下错误
我只为存储的对象分配了一个键,我正在使用重载的存储方法来存储实体。
Store 只被调用一次,为什么会抛出这样的异常。我不明白关于对象身份的一些事情。

Id除了 ravendb 持久性之外,该属性还有另一个目的。

Entity UserQuery+MyItem had document key 'mykeypath/44' but now has document key property 'MyItems/44'. You cannot change the document key property of a entity loaded into the session.

编辑以包含完整的源代码

void Main()
{
    var host = "http://myhost:8020";

    var _documentStore = new DocumentStore { Url = host, DefaultDatabase = "sdb" };
    _documentStore.Initialize();
    using (var session = _documentStore.OpenSession()) 
    {
        var path = "mykeypath/44";
        session.Store(new MyItem { Id = 303, Test = "TEST" }, path);
        session.SaveChanges();
    }
}

public class MyItem : AuditableEntity {
    public string Test { get; set; }
}

[Serializable]
public abstract class AuditableEntity : IAuditable
{
   [DataMember]
   [Display(Name = "Id", Description = "Id")]
   public long Id { get; set; }
   [DataMember]
   [Display(Name = "Modified By", Description = "Modified By")]
    public string ModifiedBy { get; set; }
   [DataMember]
   [Display(Name = "Modified Date", Description = "Modified Date")]
    public DateTime ModifiedDate { get; set; }
}
4

1 回答 1

3

如果您的类有一个名为 的属性Id,RavenDB 将默认使用它作为文档 ID。

在您的情况下,将实例MyItem设置Id303意味着文档将保存在 Id 的数据库中MyItems/303

您可以通过修改

session.Store(new MyItem { Id = 303, Test = "TEST" }, path);

符合

session.Store(new MyItem { Id = 303, Test = "TEST" });

这将起作用,结果将是:

已保存的文档

因此,问题在于您正在指示 Raven 为您的对象分配两个 ID:

  • MyItems/303, 由于Id财产的价值
  • mykeypath/44,因为您使用Store重载明确设置了此 Id。

在这种情况下,我将应用的解决方案是重命名该Id属性。如果这是不可能的(例如:该类已用于其他目的,例如 WCF 合同),请考虑创建一个新类,仅用于 RavenDB 持久性和两者之间的映射(AutoMapper等工具使这变得容易)。

更新

Id通过查看此线程,我找到了一种改变字段约定的方法。在您的情况下,您应该在打开会话之前执行以下操作:

_documentStore.Conventions.FindIdentityProperty =
    prop =>
        {
            if (prop.DeclaringType == typeof (AuditableEntity))
                return prop.Name == "CustomId";

            return prop.Name == "Id";
        };

这就是说,Id由类型定义的属性AuditableEntity不应该用作文档标识符。在所有其他情况下,请执行默认设置。

我对其进行了测试,它工作正常,在 RavenDb 工作室中显示了两个 Id 字段:):

在此处输入图像描述

于 2013-09-15T10:13:17.680 回答