【发布时间】:2020-09-01 02:27:53
【问题描述】:
前言
我尝试了几种看起来彼此相同的解决方案。我在将新文档插入 Azure Cosmos DB 时遇到问题。 我得到的错误是重复密钥错误。 我想要完成的是让 Azure Cosmos DB 为我自己生成密钥,而不是我自己必须显式创建密钥在代码中。
在我的 .Net 逻辑中生成密钥的主要问题是我的 .Net 应用程序创建重复密钥的机会,因为它有时会短暂关闭,这可能会重置其内部服务器时钟。我不相信这会在 Azure 中发生,所以我希望通过让它在插入发生时继续生成密钥来利用这一点。
简单代码示例
我正在使用接口模型将我的对象存储在 Azure 数据库中。
interface IExample
{
ObjectId Id { get; set; }
}
我也设计了一个具体的类来实现这个接口。
public class Example : IExample
{
public ObjectId Id { get; set; }
}
尝试数据注释的示例
我已经尝试在上面的接口和类中为 Id 字段使用以下属性及其组合。
interface IExample
{
[BsonId]
ObjectId Id { get; set; }
}
public class Example : IExample
{
[BsonId]
public ObjectId Id { get; set; }
}
interface IExample
{
[DatabaseGenerated(DatabaseGeneratedOption.Calculated)]
ObjectId Id { get; set; }
}
public class Example : IExample
{
[DatabaseGenerated(DatabaseGeneratedOption.Calculated)]
public ObjectId Id { get; set; }
}
interface IExample
{
[BsonId, DatabaseGenerated(DatabaseGeneratedOption.Calculated)]
ObjectId Id { get; set; }
}
public class Example : IExample
{
[BsonId, DatabaseGenerated(DatabaseGeneratedOption.Calculated)]
public ObjectId Id { get; set; }
}
当我让我的集合对象插入模型时,这些组合似乎都没有告诉 CosmosDB Id 应该由它自己生成。
存储库示例
当我将一个文档插入到我的存储库文件中的集合中时,我目前正在使用以下内容。
private ICosmosExampleDBContext _dbContext { get; set; }
private readonly IMongoCollection<IExample> _collection;
public ExampleRepository(ICosmosExampleDBContext dbContext, IOptions<ExampleOptions> options)
{
this._dbContext = dbContext;
this._collection = this._dbContext.GetCollection<IExample>(options.Value.Collection);
}
public void CreateExample(IExample example)
{
try
{
// A duplicate key error is created if I don't explicitly create the key here.
// E11000 is encountered without this, even with above data annotations.
example.Id = MongoDB.Bson.ObjectId.GenerateNewId();
this._collection.InsertOne(example);
}
catch(Exception e)
{
throw e;
}
}
我想我对这个总体问题的后续问题是:
- 让 Cosmos DB 生成我的密钥对我来说是错误的吗?
- 我是否应该继续显式创建密钥,而不是让 CosmosDB 为我生成它?
我得到的错误是 E11000 没有显式创建对象 ID。
编辑:更新了尝试数据注释的代码,以显示 IExample 的实现。
【问题讨论】:
标签: .net azure azure-cosmosdb .net-core-3.1 azure-cosmosdb-mongoapi