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");
设置密钥。
我设置了一个 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");
设置密钥。