Cosmos dbcontext 检索空结果

Cosmos dbcontext retrieves empty results

我设置了一个 DbContext 来使用 Cosmos DB,如下所示:

public class AuthenticationCosmosDataContext : DbContext, IUnitOfWork
{
    private readonly CosmosOptions cosmosOptions;

    public DbSet<Settings> Settings { get; set; }

    public AuthenticationCosmosDataContext(DbContextOptions<AuthenticationCosmosDataContext> options, IOptions<CosmosOptions> cosmosOptions) : base(options)
    {
        this.cosmosOptions = cosmosOptions.Value;
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.HasDefaultContainer(cosmosOptions.DefaultContainer);
        modelBuilder.Entity<Settings>().ToContainer(cosmosOptions.DefaultContainer);
        modelBuilder.ApplyConfiguration(new SettingsConfiguration());
    }

从 Startup.cs 开始设置,像这样:

services.AddDbContext<AuthenticationCosmosDataContext>((serviceProvider, options) =>
{
   var cosmosOptions = serviceProvider.GetRequiredService<IOptions<CosmosOptions>>().Value;
   options.UseCosmos(cosmosOptions.AccountEndpoint, cosmosOptions.AccountKey, cosmosOptions.DatabaseName);

现在,SettingsConfiguration 中的内容并不多:

builder.HasKey(x => x.Id).HasName("id");
builder.HasPartitionKey(x => x.Id); 

设置如下所示:

public class Settings
{
    public string Id { get; set; }
    public int SomeId { get; private set; }
    public string Type { get; private set; }
    public int AnotherId { get; private set; }

我试过从数据库中查询数据,购买所有东西 returns 要么是 null 要么是 0 个结果:

await cosmosContext.Settings.FirstOrDefaultAsync().ConfigureAwait(false); // returns null
await cosmosContext.Settings.CountAsync().ConfigureAwait(false); // returns 0

连接似乎没有问题,因为没有异常,我确实不得不对我的模型进行一些调整,因为与文档有些不匹配。

可能出了什么问题?


更新: 配置中的 HasName() 方法似乎没有按预期工作。如果我将该字段从“Id”重命名为“id”,它会按预期工作。寻找正确设置配置的方法

不确定是否有帮助,但您不必覆盖 OnConfiguring 方法吗?:

  public class OptionsContext : DbContext
    {
    #region Configuration
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        => optionsBuilder.UseCosmos(
            "AccountEndpoint=https://localhost:8081/;AccountKey=C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==",
            databaseName: "OptionsDB",
            options =>
            {
                options.ConnectionMode(ConnectionMode.Gateway);
                options.WebProxy(new WebProxy());
                options.LimitToEndpoint();
                options.Region(Regions.AustraliaCentral);
                options.GatewayModeMaxConnectionLimit(32);
                options.MaxRequestsPerTcpConnection(8);
                options.MaxTcpConnectionsPerEndpoint(16);
                options.IdleTcpConnectionTimeout(TimeSpan.FromMinutes(1));
                options.OpenTcpConnectionTimeout(TimeSpan.FromMinutes(1));
                options.RequestTimeout(TimeSpan.FromMinutes(1));
            });
    #endregion
}

另外:您可以通过代码在 Db 中创建元素吗?

您应该使用 builder.Property(p => p.Id).ToJsonProperty("id"); 设置密钥。