Spanner - Entity Framework System.InvalidOperationException: 'No primary key was found in the database for table

问题描述 投票:0回答:0

我正在尝试首先编写一个带有扳手和实体框架核心的数据库。 但是当 EnsureCreated 被命中时,应用程序抛出以下异常

System.InvalidOperationException: 'No primary key was found in the database for table Table DistributionChannel. Call SpannerModelValidationConnectionProvider.Instance.EnableDatabaseModelValidation(false) to disable model validation if this error is a false positive.' 

分销渠道

public class DistributionChannel{
 public Guid Id { get; set; }
 public string Name {get;set;}
}

SpannerContext

public class SpannerContext : DbContext, IDesignTimeDbContextFactory<SpannerContext>
{
    public SpannerContext()
    {
    }

    public SpannerContext(DbContextOptions options) : base(options)
    {
    }
    public DbSet<DistributionChannel> DistributionChannels { get; set; }

    public SpannerContext CreateDbContext(string[] args)
    {
        var builder = new DbContextOptionsBuilder<SpannerContext>();

        var configBuilder = new ConfigurationBuilder()
            .SetBasePath($"{AppContext.BaseDirectory}/Configurations")
            .AddJsonFile("migrations.json")
            .Build();

        var configuration = configBuilder.GetSpannerConfiguration();

        var databaseName = DatabaseName.FromProjectInstanceDatabase(configuration.ProjectId, configuration.InstanceId, configuration.DatabaseId);
        var dataSource = $"Data Source={databaseName}";

        var connectionString = new SpannerConnectionStringBuilder(dataSource).ConnectionString;

        builder.UseSpanner(connectionString,
            config => { config.CommandTimeout(configuration.Timeout); });

        return new SpannerContext(builder.Options);
    }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.EnableSensitiveDataLogging();
        base.OnConfiguring(optionsBuilder);
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.ApplyConfiguration(new DistributionChannelConfiguration());
        modelBuilder.AddJsonFields();

    }
}

DistributionChannelConfiguration

internal class DistributionChannelConfiguration : IEntityTypeConfiguration<DistributionChannel>
{
    public void Configure(EntityTypeBuilder<DistributionChannel> entity)
    {
        entity.ToTable("DistributionChannel");
        
        entity.HasKey(x => x.Id);
        entity.Property(e => e.Name)
            .IsRequired()
            .HasMaxLength(255)
            .IsUnicode(false);
    }
}

启动

我正在调用 Database.EnsureCreated

//rest of code 

using var scope = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>().CreateScope();
using var context = scope.ServiceProvider.GetRequiredService<SpannerContext>();
context.Database.EnsureCreated();

我在这里遗漏了一些微不足道的东西吗?

c# entity-framework-core google-cloud-spanner
© www.soinside.com 2019 - 2024. All rights reserved.