使用build 2.5.2910
所以我们以正常的方式在数据库中存储一个成员:
await session.StoreAsync(member)
我可以在
时以该成员身份登录await session.LoadByUniqueConstraintAsync<Member>(m => m.Email, email)
然后我批量更新电子邮件地址(批次只包含那个电子邮件地址)
for (var batch = 0; (records = allRecords.Skip(batch * BatchSize).Take(BatchSize).ToList()).Any(); batch++)
{
using(var querySession = this.documentStore.OpenSession())
{
var existingMembers = session.Query<Member, Member_ByEmail> ().Where(m => m.Email.In(records.Select(r => r.OldEmailAddress))).ToDictionary(m => m.Email, m => m);
using(var bulkInsertOperation = this.documentStore.BulkInsert(this.systemConfiguration.DatabaseName, new BulkInsertOptions { CheckForUpdates = true }))
{
foreach(var member in records)
{
var existingMemberKey = member.OldEmailAddress;
var existingMemberRecord = existingMembers[existingMemberKey];
existingMemberRecord.Email = member.EmailAddress;
}
}
}
}
当我尝试使用新的电子邮件地址再次登录时,此行:
await session.LoadByUniqueConstraintAsync<Member>(m => m.Email, email)
返回null ....
我已检查过正在使用的新电子邮件是否与数据库中的电子邮件相同。数据库显示新的数据库。我已经使用了数据库界面并查询了新电子邮件的索引,并且有效。
我已将数据库设置为使用等待非陈旧结果以及:
store.Conventions.DefaultQueryingConsistency = ConsistencyOptions.AlwaysWaitForNonStaleResultsAsOfLastWrite;
这些选项都没有奏效。
我想知道我是否有一些与批量插入操作有关的特殊内容,以便让.NET客户端读取这封新电子邮件的索引。
我已经在运行时钻进了session变量,发现有一个已知的缺失id字段,其中包含以下值:
"UniqueConstraints/members/email/Ym1hcmxleTFAbmV3b3JiaXQuY28udWs="
答案 0 :(得分:1)
您需要下载Raven插件Raven.Bundles.UniqueConstraints.dll
并将其添加到Raven安装文件夹(在我的情况下为\Plugins\
)的D:\RavenDB\Plugins
目录中
执行完此操作后,您将需要重新插入记录(我删除了数据库并重新播种了。)