#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. Хурьяни?