c# - 如何在类库项目中首先使用 EF Core Code 创建数据库

标签 c# .net sql-server entity-framework-core .net-6.0

我有 .NET 6 中的独立类库项目(没有 Web API/MVC 项目)的解决方案。我没有添加任何启动项目作为 Web API 或 MVC。我在该项目中添加了模型和数据库上下文类,如下所示。

public class Producer
{

    [Key]
    public int ProducerID { get; set; }

    [Required]
    [StringLength(254)]
    public string Name { get; set; }

    public ICollection<Product> Products { get; set; }
}
public class Product
    {

        [Key]
        public int ProductID { get; set; }

        public int ProducerID { get; set; }

        [Required]
        [StringLength(254)]
        public string Name { get; set; }

        public Producer Producer { get; set;}
    }

在我的 DBContext 类中代码如下。

public class AppDbContext : DbContext
    {
        private readonly string _connectionString;
        private readonly IConfiguration _iConfig;
        public AppDbContext(DbContextOptions<AppDbContext> options, IConfiguration iConfig) : base(options) {
            _connectionString = GetConnectionString(iConfig);
            _iConfig = iConfig;
        }

        public static string GetConnectionString(IConfiguration iConfig)
        {
            var dataSource = iConfig["db:serverName"];
            var port = iConfig["db:port"];
            if (!string.IsNullOrWhiteSpace(port))
                dataSource += "," + port;

            SqlConnectionStringBuilder builder = new()
            {
                ["Data Source"] = dataSource,
                ["Initial Catalog"] = iConfig["db:initialCatalog"],
                ["User ID"] = iConfig["db:userId"],
                ["Password"] = iConfig["db:password"]
            };

            return builder.ConnectionString;
        }
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
                                              => optionsBuilder.UseSqlServer(_connectionString);

        public DbSet<Producer> Producers { get; set; }
        public DbSet<Product> Products { get; set; }


    }

当我运行 add-migration 命令时,出现错误:

Unable to create an object of type 'AppDbContext'. For the different patterns supported at design time, see https://go.microsoft.com/fwlink/?linkid=851728

方法 2 - 我使用控制台应用程序完成了相同的代码,以便我可以启动项目,但错误仍然相同。

我在这里缺少什么。提前致谢。

最佳答案

您只能将 IDesignTimeDbContextFactory 用于类库,并且应该安装 Microsoft.EntityFrameworkCore.Tools 来执行迁移命令。

public class AppDbContextFactory : IDesignTimeDbContextFactory<AppDbContext>
{
    public AppDbContext CreateDbContext(string[] args)
    {
        var optionsBuilder = new DbContextOptionsBuilder<AppDbContext>();
        optionsBuilder.UseSqlServer("Server=(localdb)\\mssqllocaldb;Database=MyDatabase;Trusted_Connection=True;MultipleActiveResultSets=true");

        return new AppDbContext(optionsBuilder.Options);
    }
}

数据库上下文:

public class AppDbContext : DbContext
{
    public AppDbContext(DbContextOptions<AppDbContext> options) : base(options)
    {

    }
    public DbSet<Product> Products { get; set; }
}

关于c# - 如何在类库项目中首先使用 EF Core Code 创建数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75111851/

相关文章:

c# - 从对象转换为字符串时如何处理空异常?

c# - 如何使用 MVVM 从代码中使用 "text.changed"控件(在 Xamarin.Forms 中)

.net - 何时使用 BackgroundWorker 或自己管理线程?

sql - 使用 try-catch block 在 Sql-Server 中删除表

c# - 为什么 TimeSpan.ParseExact 不起作用

c# - 如何计算标准差[数组]

c# - 如何将图标添加到现有的 exe 文件(默认情况下没有图标)?

c# - 如何在 .net Framework 4.6 上启用 Vector.IsHardwareAccelerated?

sql-server - 从 SQL Server 中的不同数据库创建用户

c# - 可空对象必须有一个值#2