我正在使用 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 列表。我不需要/不想将所有产品数据存储在所有者记录中。
我只需要返回这里产品的 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}");
}
}
}
输入:
输出: