Преобразование ядра Ef не работает с использованием поставщика CosmosDB

#c# #entity-framework-core #azure-cosmosdb #azure-cosmosdb-sqlapi #ef-core-3.1

#c# #entity-framework-core #azure-cosmosdb #azure-cosmosdb-sqlapi #ef-core-3.1

Вопрос:

Я использую ядро Ef с поставщиком CosmosDB и хочу использовать строго типизированный идентификатор для своих объектов, но мой код работает некорректно. подробнее:

Домен:

 public class Customer : Entity
{
    public CustomerId Id { get; set; }
    public string PartitionKey { get; set; }
    public string FirstName { get; set; }
    public string DocumentType { get; set; }
}

public class CustomerId : TypedId<string>
{
    public CustomerId(string value) : base(value)
    {
    }
}
public class TypedId<TKey>
{
    public TKey Value { get; }
    protected TypedId(TKey value)
    {
        Value = value;
    }
}
  

Конфигурация:

 class CustomerConfiguration : IEntityTypeConfiguration<Customer>
{
    public void Configure(EntityTypeBuilder<Customer> builder)
    {
        builder.HasPartitionKey(x => x.PartitionKey);

        builder.Property(x => x.Id).ToJsonProperty("id");

        builder.Property(x => x.Id).HasConversion(x => x.Value, x => new CustomerId((x)));
        builder.HasKey(x => x.Id);
        builder.Property(x => x.PartitionKey).ToJsonProperty("partitionKey");
        builder.Property(x => x.FirstName).ToJsonProperty("firstName");

        builder.Property(x => x.DocumentType).ToJsonProperty("documentType");
        builder.HasDiscriminator(x => x.DocumentType);
    }
}
  

после сохранения объекта с

id = новый идентификатор пользователя (someGuid.toString())

это результат, но я ожидаю, что в качестве идентификатора будет указан идентификатор GUID:

 {
   "id": "Customer|Domain.Customers.CustomerId",
   "documentType": "CustomerProfile",
   "firstName": "Moji",
   "partitionKey": "100-2",
   "_rid": "8L5mAKVMiToMAAAAAAAAAA==",
   "_self": "dbs/8L5mAA==/colls/8L5mAKVMiTo=/docs/8L5mAKVMiToMAAAAAAAAAA==/",
   "_etag": ""00000000-0000-0000-b5ac-bcf438d801d6"",
   "_attachments": "attachments/",
   "_ts": 1604825656
}
  

у кого-нибудь есть идея, где я ошибаюсь?

Комментарии:

1. Что там TypedId общего?

2. @AthanasiosKataras Я вставил код в вопрос.

3. Уверен, что это сбивает с толку Cosmos SDK. Почему бы просто не сделать ваш идентификатор строкой и не поместить новый идентификатор guid в установщик?

Ответ №1:

Преобразование datatype Id из CustomerId в string и сохранение документа без добавления какого-либо значения для идентификатора:

 public string Id { get; set; }
  

Cosmos DB автоматически создаст для вас идентификатор GUID.

Комментарии:

1. Поможет ли вам этот ответ @M. Хурьяни?