使用.Net Core 3.1中的MongoDB API在Azure Cosmos DB中出现重复的关键问题

肯尼斯·科内特(Kenneth Cornett)

前言

我尝试了几种看起来彼此相同的解决方案。关于将新文档插入我的Azure Cosmos数据库的问题。我得到的错误是重复的键错误。我要完成的工作是让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的实现

肯尼斯·科内特(Kenneth Cornett)

经过进一步开发研究

在解决了更多问题之后,并使我的API可以用于POST,PATCH和GET,我注意到使用ObjectId属性非常困难我还发现了一个帖子,指出建议在属性ObjectId类型上使用字符串

序列化Mongo ObjectId第三部分ZOXEXIVO的答案时JSON.NET转换错误

将字符串ID字段与[BsonId,BsonRepresentation(BsonType.ObjectId)]数据注释一起使用,可使CosmosDB在输入时自行生成密钥。我更新了数据模型以将以下内容用于其Id属性。

范例程式码

public interface IExample
{
    public string Id { get; set; }
}
public class Example : IExample
{
    [BsonId, BsonRepresentation(BsonType.ObjectId)]
    public string Id { get; set; }
}

资料库

我还更新了存储库,以通过接口IExample使用具体的类Example。这使我可以在Startup.cs中将数据类型注册为Bson文档。

private ICosmosExampleDBContext _dbContext { get; set; }
private readonly IMongoCollection<Example> _collection;
public ExampleRepository(ICosmosExampleDBContext dbContext, IOptions<ExampleOptions> options)
{
    this._dbContext = dbContext;
    this._collection = this._dbContext.GetCollection<Example>(options.Value.Collection);
}
public void CreateExample(Example example)
{
    try
    {
        // Since Id is now a string, when it is empty, it gets populated for me.
        // example.Id = MongoDB.Bson.ObjectId.GenerateNewId();
        this._collection.InsertOne(example);
    }
    catch(Exception e)
    {
        throw e;
    }
}

概要

总体而言,解决与我的方法有关的问题的结果使我学习了在类中使用字符串Id属性的知识。通过将字符串Id属性与BsonIdBsonRepresentation(BsonType.ObjectId)数据注释一起使用,CosmosDb可以为帖子中的解决方案生成唯一的键。对于将来的数据模型,我将向其他开发人员推荐此解决方案,因为它还清理了在GET中返回的这些数据模型。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

有关Azure Cosmos DB-.NET Core中CreateItemAsync和新PartitionKey的困惑

来自分类Dev

如何在 azure cosmos db 中为 asp.net core web api 实现上一个/下一个分页

来自分类Dev

使用 MongoDB API 的 Cosmos DB 乐观并发

来自分类Dev

Flask应用程序使用Azure Cosmos DB for MongoDB API连接错误

来自分类Dev

从.NET Core批量上传/导入JSON文件到Azure Cosmos DB

来自分类Dev

使用 REST API 向 .Net Core Core 中的 Azure 服务总线队列发送消息

来自分类Dev

使用 PowerShell (SQL API) 在 Cosmos DB 中插入文档

来自分类Dev

Azure Cosmos DB(EF / Core)-骆驼案例属性名称

来自分类Dev

使用Azure Blob存储中的.Net Core API异步流式传输视频

来自分类Dev

Azure Cosmos DB 中嵌套字段的索引

来自分类Dev

如何使用gremlin API在Azure Cosmos DB中进行左联接

来自分类Dev

使用python的Azure Blue Cosmos DB SQL API的地理空间数据

来自分类Dev

将Cosmos DB模拟器(MongoDB API)迁移到Azure时发生致命错误

来自分类Dev

使用 JavaScript Azure 函数写入 Azure Cosmos DB

来自分类Dev

Azure Cosmos DB查询

来自分类Dev

Azure Cosmos DB 分区

来自分类Dev

api net.core 1.1 中的 Azure 通知中心

来自分类Dev

如何使用Node.js在Azure Cosmos DB中执行SQL查询

来自分类Dev

使用Azure数据工厂在增量加载期间从Cosmos Db集合中删除文档

来自分类Dev

如何使用查询从 azure cosmos db 中获取所有记录

来自分类Dev

无法使用Microsoft.EntityFrameworkCore.Cosmos连接到Azure Cosmos Db帐户-响应状态代码

来自分类Dev

Cosmos DB阵列查询在.NET SDK中不起作用

来自分类Dev

Cosmos DB ASP.NET MVC 中的多个条目

来自分类Dev

如何使用Cosmos DB触发器构建Azure功能?

来自分类Dev

如何在Azure Cosmos DB中使用SUM聚合功能

来自分类Dev

使用 local.settings.json 的 Azure 函数 cosmos db 输出

来自分类Dev

Azure Cosmos DB 上的 MongoDB $sortbycount 解决方法

来自分类Dev

Cosmos DB SDK v3中的首选位置

来自分类Dev

使用 MongoDB.Driver 库的 Cosmos DB 故障转移

Related 相关文章

  1. 1

    有关Azure Cosmos DB-.NET Core中CreateItemAsync和新PartitionKey的困惑

  2. 2

    如何在 azure cosmos db 中为 asp.net core web api 实现上一个/下一个分页

  3. 3

    使用 MongoDB API 的 Cosmos DB 乐观并发

  4. 4

    Flask应用程序使用Azure Cosmos DB for MongoDB API连接错误

  5. 5

    从.NET Core批量上传/导入JSON文件到Azure Cosmos DB

  6. 6

    使用 REST API 向 .Net Core Core 中的 Azure 服务总线队列发送消息

  7. 7

    使用 PowerShell (SQL API) 在 Cosmos DB 中插入文档

  8. 8

    Azure Cosmos DB(EF / Core)-骆驼案例属性名称

  9. 9

    使用Azure Blob存储中的.Net Core API异步流式传输视频

  10. 10

    Azure Cosmos DB 中嵌套字段的索引

  11. 11

    如何使用gremlin API在Azure Cosmos DB中进行左联接

  12. 12

    使用python的Azure Blue Cosmos DB SQL API的地理空间数据

  13. 13

    将Cosmos DB模拟器(MongoDB API)迁移到Azure时发生致命错误

  14. 14

    使用 JavaScript Azure 函数写入 Azure Cosmos DB

  15. 15

    Azure Cosmos DB查询

  16. 16

    Azure Cosmos DB 分区

  17. 17

    api net.core 1.1 中的 Azure 通知中心

  18. 18

    如何使用Node.js在Azure Cosmos DB中执行SQL查询

  19. 19

    使用Azure数据工厂在增量加载期间从Cosmos Db集合中删除文档

  20. 20

    如何使用查询从 azure cosmos db 中获取所有记录

  21. 21

    无法使用Microsoft.EntityFrameworkCore.Cosmos连接到Azure Cosmos Db帐户-响应状态代码

  22. 22

    Cosmos DB阵列查询在.NET SDK中不起作用

  23. 23

    Cosmos DB ASP.NET MVC 中的多个条目

  24. 24

    如何使用Cosmos DB触发器构建Azure功能?

  25. 25

    如何在Azure Cosmos DB中使用SUM聚合功能

  26. 26

    使用 local.settings.json 的 Azure 函数 cosmos db 输出

  27. 27

    Azure Cosmos DB 上的 MongoDB $sortbycount 解决方法

  28. 28

    Cosmos DB SDK v3中的首选位置

  29. 29

    使用 MongoDB.Driver 库的 Cosmos DB 故障转移

热门标签

归档