我正在使用 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 程序集放到 Plugins 目录中。
我是通过 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 似乎不起作用,这个https://groups.google.com/forum/#!searchin/ravendb/unique|sort:relevance/ravendb/KzO-eIf9vV0/NJyJ4DNniFUJ和许多其他的人们有同样的问题没有解决方案。在某些情况下,他们说正在检查该属性是否已作为解决方案手动存在于数据库中。
该文件还说:
要在服务器范围内激活唯一约束,只需将唯一约束添加到全局配置文件中的 Raven/ActiveBundles 配置中,或者使用 API 或 Studio 设置一个新的数据库并打开唯一约束包
但不知道该怎么做。我做了一些搜索并找到了一个可能的方法:在 Studio 中,选择数据库,转到设置 -> 数据库设置,我找到了这个配置:
{
"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 版本。