Postgresql 无法创建类型为';AppContext';。Npgsql+;埃夫科尔

Postgresql 无法创建类型为';AppContext';。Npgsql+;埃夫科尔,postgresql,.net-core,entity-framework-core,Postgresql,.net Core,Entity Framework Core,如何解决我的“HelloEFCore”.NET核心控制台应用程序异常?我使用Npgsql实体框架核心提供程序() 无法创建“AppContext”类型的对象。有关设计时支持的不同模式,请参见 它发生在我尝试进行初始迁移时 dotnet ef migrations add CreateDatabase 我正在使用的代码: Program.cs class Program { static void Main(string[] args) { AppContext

如何解决我的“HelloEFCore”.NET核心控制台应用程序异常?我使用Npgsql实体框架核心提供程序()

无法创建“AppContext”类型的对象。有关设计时支持的不同模式,请参见

它发生在我尝试进行初始迁移时

dotnet ef migrations add CreateDatabase
我正在使用的代码:

Program.cs

class Program
{
    static void Main(string[] args)
    {
        AppContext a = new AppContext("Server=127.0.0.1; port=5432; user_id=postgres; password=root; database=db; pooling=true");
    }
}
public class Product
{
    public int ProductId { get; set; }
    public string Name { get; set; }
    public decimal Price { get; set; }
    public string Description { get; set; }
    public int Quantity { get; set; }
    public int BrandId { get; set; }
    public Brand Brand { get; set; }
}
public class Brand
{
    public int BrandId { get; set; }
    public string Name { get; set; }
    public List<Product> Products { get; set; } = new List<Product>();
}
public class AppContext : DbContext
{
    public DbSet<Product> Products { get; set; }
    public DbSet<Brand> Brands { get; set; }
    private readonly string _connectionString;
    public AppContext(string connectionString)
    {
        _connectionString = connectionString ?? 
            throw new ArgumentException("connectionString is empty.");
    }
    protected override void OnConfiguring(DbContextOptionsBuilder builder)
    {
        builder.UseNpgsql(_connectionString);
    }
}
Product.cs

class Program
{
    static void Main(string[] args)
    {
        AppContext a = new AppContext("Server=127.0.0.1; port=5432; user_id=postgres; password=root; database=db; pooling=true");
    }
}
public class Product
{
    public int ProductId { get; set; }
    public string Name { get; set; }
    public decimal Price { get; set; }
    public string Description { get; set; }
    public int Quantity { get; set; }
    public int BrandId { get; set; }
    public Brand Brand { get; set; }
}
public class Brand
{
    public int BrandId { get; set; }
    public string Name { get; set; }
    public List<Product> Products { get; set; } = new List<Product>();
}
public class AppContext : DbContext
{
    public DbSet<Product> Products { get; set; }
    public DbSet<Brand> Brands { get; set; }
    private readonly string _connectionString;
    public AppContext(string connectionString)
    {
        _connectionString = connectionString ?? 
            throw new ArgumentException("connectionString is empty.");
    }
    protected override void OnConfiguring(DbContextOptionsBuilder builder)
    {
        builder.UseNpgsql(_connectionString);
    }
}
Brand.cs

class Program
{
    static void Main(string[] args)
    {
        AppContext a = new AppContext("Server=127.0.0.1; port=5432; user_id=postgres; password=root; database=db; pooling=true");
    }
}
public class Product
{
    public int ProductId { get; set; }
    public string Name { get; set; }
    public decimal Price { get; set; }
    public string Description { get; set; }
    public int Quantity { get; set; }
    public int BrandId { get; set; }
    public Brand Brand { get; set; }
}
public class Brand
{
    public int BrandId { get; set; }
    public string Name { get; set; }
    public List<Product> Products { get; set; } = new List<Product>();
}
public class AppContext : DbContext
{
    public DbSet<Product> Products { get; set; }
    public DbSet<Brand> Brands { get; set; }
    private readonly string _connectionString;
    public AppContext(string connectionString)
    {
        _connectionString = connectionString ?? 
            throw new ArgumentException("connectionString is empty.");
    }
    protected override void OnConfiguring(DbContextOptionsBuilder builder)
    {
        builder.UseNpgsql(_connectionString);
    }
}
公共级品牌
{
public int BrandId{get;set;}
公共字符串名称{get;set;}
公共列表产品{get;set;}=new List();
}
AppContext.cs

class Program
{
    static void Main(string[] args)
    {
        AppContext a = new AppContext("Server=127.0.0.1; port=5432; user_id=postgres; password=root; database=db; pooling=true");
    }
}
public class Product
{
    public int ProductId { get; set; }
    public string Name { get; set; }
    public decimal Price { get; set; }
    public string Description { get; set; }
    public int Quantity { get; set; }
    public int BrandId { get; set; }
    public Brand Brand { get; set; }
}
public class Brand
{
    public int BrandId { get; set; }
    public string Name { get; set; }
    public List<Product> Products { get; set; } = new List<Product>();
}
public class AppContext : DbContext
{
    public DbSet<Product> Products { get; set; }
    public DbSet<Brand> Brands { get; set; }
    private readonly string _connectionString;
    public AppContext(string connectionString)
    {
        _connectionString = connectionString ?? 
            throw new ArgumentException("connectionString is empty.");
    }
    protected override void OnConfiguring(DbContextOptionsBuilder builder)
    {
        builder.UseNpgsql(_connectionString);
    }
}
公共类AppContext:DbContext
{
公共数据库集产品{get;set;}
公共DbSet品牌{get;set;}
私有只读字符串_connectionString;
公共AppContext(字符串连接字符串)
{
_connectionString=connectionString??
抛出新ArgumentException(“connectionString为空”);
}
配置时受保护的覆盖无效(DbContextOptionsBuilder)
{
builder.UseNpgsql(_connectionString);
}
}
efstart.csproj

<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
  <OutputType>Exe</OutputType>
  <TargetFramework>netcoreapp3.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
  <PackageReference Include="Microsoft.EntityFrameworkCore" Version="3.1.8" />
  <PackageReference Include="Npgsql" Version="4.1.3"/>
  <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="3.1.3"/>
  <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="3.1.4"/>
</ItemGroup>
</Project>

Exe
netcoreapp3.1

应用程序编译良好。我在Ubuntu 20.04上使用pgAdmin。

您需要实现IDesignTimeDbContextFactory接口,使您的解决方案能够正常工作

public class AppContext Factory : IDesignTimeDbContextFactory< AppContext>
{
    public AppContext CreateDbContext(string[] args)
    {
        var builder = new DbContextOptionsBuilder<AppContext>();

        builder.UseNpgsql(connectionString);

        return new DataContext(builder.Options);
    }
}
公共类AppContext工厂:IDesignTimeDbContextFactory
{
公共AppContext CreateDbContext(字符串[]args)
{
var builder=new DbContextOptionsBuilder();
builder.UseNpgsql(connectionString);
返回新的DataContext(builder.Options);
}
}

请检查我对以下问题的回答:解决方案也应该在您的上下文中工作,只需根据您的需要调整上下文名称、数据库和路径/文件名。我删除了一个构造函数:an可以正常工作,但我希望它能与DI一起工作。您能否显示实现IDesignTimeDbContextFactory的完整代码,因为它看起来很痛苦。我特别想知道如何注入connectionstring。我想这就是你要找的