【发布时间】:2017-04-13 13:05:19
【问题描述】:
我正在使用 RavenDb 服务器和客户端 3.5.0,我试图让 UniqueConstraint 工作但没有成功。
简单案例:
using Raven.Client.UniqueConstraints;
public class User {
public string Id { get; set; }
[UniqueConstraint]
public string Email { get; set; }
}
文档说:
在插件中删除 Raven.Bundles.UniqueContraints 程序集 目录。
我是通过 NuGet 完成的:Install-Package RavenDB.Bundles.UniqueConstraints -Version 3.5.0
然后将二进制 Raven.Bundles.UniqueConstraints.dll 粘贴到我自己在 Raven 根目录中创建的文件夹 Plugins 中。
保存用户文档后,我在元数据中得到了这个:
"Ensure-Unique-Constraints": [
{
"Name": "Email",
"CaseInsensitive": false
}
]
似乎一切正常,但我仍然使用同一电子邮件保存文档。
UniqueConstraintCheckResult<User> checkResult = session.CheckForUniqueConstraints(user);
// returns whether its constraints are available
if (checkResult.ConstraintsAreFree())
{
session.Store(user);
session.SaveChanges();
}
我检查了这个链接RavenDB UniqueConstraint doesn't seem to work 和这个https://groups.google.com/forum/#!searchin/ravendb/unique|sort:relevance/ravendb/KzO-eIf9vV0/NJyJ4DNniFUJ 和许多其他人有同样的问题没有解决方案。在某些情况下,他们表示正在手动检查该属性是否已存在于数据库中作为解决方案。
文档还说:
要在服务器范围内激活唯一约束,只需添加 Unique 全局中对 Raven/ActiveBundles 配置的约束 配置文件,或使用唯一的设置一个新的数据库 使用 API 或 Studio 开启约束包
但不知道该怎么做。我做了一些搜索并找到了一个可能的方法: 在 Studio 中,选择数据库,进入 Settings -> Database settings,我找到了这个配置:
{
"Id": "TestRaven",
"Settings": {
"Raven/DataDir": "~\\TestRaven"
},
"SecuredSettings": {},
"Disabled": false
}
我尝试添加此配置:
"Settings": {
"Raven/DataDir": "~\\TestRaven",
"Raven/ActiveBundles": "UniqueConstraints"
}
然后我在尝试保存时遇到错误。错误消息说“数据库已经创建并且无法修改或添加包”之类的内容,并建议添加此行"Raven-Temp-Allow-Bundles-Change": true,我能够使用 UniqueConstraint 包配置保存 de 设置。
到目前为止,我认为我完成了文档描述的所有要求。最后一个是:
任何未添加到 ActiveBundles 列表中的捆绑包都不会被 处于活动状态,即使相关程序集位于 Plugins 目录中。
我发现捆绑列表的唯一地方是在 Studio 中创建一个新数据库,但该列表不可编辑,只是有关已启用的内容的信息。
文档说了很多要求,但没有告诉我们怎么做,超级聪明,我们必须尝试 gess 如何。到目前为止我可以到达这里,但你猜怎么着?还是不行!
我的问题是,UniqueConstraints 真的可以在 RavenDb 中使用吗?有人让这个工作吗?
如果是,云请告诉我怎么做?
提前谢谢你!
[已编辑] 我忘了提到我添加了以下行:
store.Listeners.RegisterListener(new UniqueConstraintsStoreListener());
并且还尝试了 3.5.1 版本。
【问题讨论】: