使用 NoSQL 数据库时如何解决 EF 不喜欢列表的问题?

问题描述 投票:0回答:1

我正在使用 CosmosDB,它只存储 JSON 文档(无论如何,这是我的理解)

到目前为止一切都很好,我有几个集合正在工作。我现在有一个集合,它将存储指南列表。 EF 对实体和主键感到恐惧,这在 SQL 领域是有意义的,因为它是不同的动态,这将表示实际的数据库关系。

实体类型“List”需要定义主键。如果您打算使用无键实体类型,请在“OnModelCreating”中调用“HasNoKey”。

但在这里,我希望它只是将 Guid 作为字符串保存在该属性下的 JSON 数组中。定义了一个键,因此抱怨该键似乎很奇怪。使其成为无钥匙实体的建议是不受欢迎的,而且看起来……很愚蠢。

public class OwnerModel {
    public Guid Id { get; set; }    
    public List<Guid> ProductIds { get; set; } = new();
}

在 FluentAPI 中:

builder.Entity<OwnerModel >()
    .ToContainer(nameof(OwnerModel))
    .HasNoDiscriminator()
    .HasKey("Id");

我还没有构建 ProductModel 或其他任何东西,但是前端将利用这些数据,我只需要在此处返回产品的 id 列表。我不需要/不想将所有产品数据存储在所有者记录中。

entity-framework azure-cosmosdb
1个回答
0
投票

我只需要返回这里产品的 id 列表。我不需要/不想将所有产品数据存储在所有者记录中。

说明:

下面是我为获取productId列表而编写的解释和代码

  • 应用程序使用

    Owners
    集合来读取所有者文档。使用所有者 ID 检索文档。

  • 要获取所有产品 ID 的列表,请查询

    Products
    集合。

  • 产品 ID 列表将添加到 Owner 类的 ProductIds 字段,这会更新检索到的所有者记录。

  • ReplaceItemAsync
    方法用于替换
    Owners
    集合中过时的所有者文档。

我尝试过的代码:

static async Task Main(string[] args)
    {
        string endpointUrl = "****";
        string primaryKey = "****";
        string databaseId = "newDb";
        string productsCollectionId = "Products";
        string ownersCollectionId = "Owners";
        string ownerId = "1"; // ID of the owner you want to update

        using (CosmosClient client = new CosmosClient(endpointUrl, primaryKey))
        {
            try
            {
                var database = client.GetDatabase(databaseId);
                var productsContainer = database.GetContainer(productsCollectionId);
                var ownersContainer = database.GetContainer(ownersCollectionId);

                // Retrieve the owner document
                var ownerResponse = await ownersContainer.ReadItemAsync<Owner>(ownerId, new PartitionKey(ownerId));
                var owner = ownerResponse.Resource;

                // Retrieve all product IDs from the Products collection
                var productIdsIterator = productsContainer.GetItemQueryIterator<string>(
                    new QueryDefinition("SELECT VALUE c.id FROM c"));

                var productIds = new List<string>();
                while (productIdsIterator.HasMoreResults)
                {
                    var response = await productIdsIterator.ReadNextAsync();
                    productIds.AddRange(response);
                }

                owner.ProductIds = productIds;
                await ownersContainer.ReplaceItemAsync(owner, owner.Id, new PartitionKey(owner.Id));
                Console.WriteLine("All Product IDs added to the owner document.");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Error occurred: {ex.Message}");
            }
        }
    }

输入: enter image description here

输出: enter image description here

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.