Мы используем Ef Core
в качестве ORM
для выполнения операций с базой данных. Поскольку EF Core Cosmos
не поддерживает массовые вставки в Cosmos, мы также используем Cosmos Client
. Когда мы выполняем массовые вставки, мы используем следующий код:
public async Task UploadAsync<T>(string databaseName, string containerName, Func<Container, IEnumerable<Task>> dbOperations)
{
var instanceUrl = //Commented out
var primaryKey = //Commented out
var options = new CosmosClientOptions
{
AllowBulkExecution = true,
ConnectionMode = ConnectionMode.Gateway
};
using var client = new CosmosClient(instanceUrl, primaryKey, options);
var container = client.GetContainer(databaseName, containerName);
var operations = dbOperations(container);
await Task.WhenAll(operations);
}
Это работает отлично и позволяет нам очень быстро массово вставлять много данных в космос. Теперь мы хотим прочитать вставленные данные с помощью Entity Framework Core с нашим общим шаблоном репозитория c:
public async Task<IEnumerable<TEntity>> ReadAsync(Expression<Func<TEntity, bool>> predicate)
{
return await _diagnostics.RunAsync(async () =>
{
var cts = new CancellationTokenSource();
cts.CancelAfter(CancelRequestAfter);
var queryable = _dbContext.Set<TEntity>().Where(predicate);
return await queryable.ToListAsync(cts.Token);
});
}
Этот репозиторий работает, как и ожидалось, но только , если объект был сохраняется EF Core
. Однако я могу читать документы, созданные EF Core
с помощью Cosmos Client
.
. Я начал изучать, почему наши запросы ничего не возвращают, сравнивая два документа в Azure Cosmos Data Explorer
. Первый документ создается с помощью Cosmos client
, а второй документ - с помощью EF Core
. Единственное отличие, которое я могу заметить, это то, что EF Core автоматически добавляет что-то под названием "Discriminator"
в наши документы. Поэтому я подозреваю, что это root причина ..
- Может кто-нибудь проверить мой тезис? Если так, как я могу решить это?
- Есть ли у
EF Core
какие-либо операции массовой вставки, такие как Cosmos Client
?