【问题标题】:Using Entity Framework Core 3.1 with Windows Application or Console Application将 Entity Framework Core 3.1 与 Windows 应用程序或控制台应用程序一起使用
【发布时间】:2020-10-20 21:44:33
【问题描述】:

我只是在学习Entity Framework Core 3.1。我想知道为什么所有的学习内容都是用ASP.Net Core来学习的!!所以我决定在Class LibraryConsole Application 上测试一些代码。这是我非常简单的类库代码:

public class ApplicationDbContext : DbContext
{
    private static readonly string ConnectionString = "Server=.;Database=Northwind;Trusted_Connection=True;";
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options)
    {
    }

    public DbSet<NimaCategory> NimaCategories { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        if (!optionsBuilder.IsConfigured)
        {
            optionsBuilder.UseSqlServer(ConnectionString);
        }
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.ApplyConfiguration(new NimaCategoryConfig());
    }
}

我在创建Migration 时遇到了许多奇怪的错误,但最奇怪的是我必须将所有这些代码行写入我的Console Application

public class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Hello EF Core")
    }
    public static IHostBuilder CreateHostBuilder(string[] args)
                    => Host.CreateDefaultBuilder(args)
                        .ConfigureWebHostDefaults(
                            webBuilder => webBuilder.UseStartup<Startup>());

}
public class Startup
{
    public void ConfigureServices(IServiceCollection services)
        => services.AddDbContext<ApplicationDbContext>();
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
    }
}

问题是IHostBuilderConfigureWebHostDefaults 是针对ASP.Net Core 的,它是依赖注入引擎。因此,根据以下链接,我更改了我的 csproj 文件:

IHostBuilder does not contain a definition for ConfigureWebHostDefaults

现在我无法运行我的控制台应用程序,因为它的性质已经改变并转换为 Web 项目。然后我添加一个窗口应用程序,我无法添加这些代码进行配置:

public static IHostBuilder CreateHostBuilder(string[] args)
                    => Host.CreateDefaultBuilder(args)
                        .ConfigureWebHostDefaults(
                            webBuilder => webBuilder.UseStartup<Startup>());

和:

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
        => services.AddDbContext<ApplicationDbContext>();
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
    }
}

我对这个问题有一些疑问:

  1. 为什么 EF Core 仅限于 ASP.Net Core?全世界的项目都是用ASP.Net Core写的吗?

  2. 有没有人有使用 EF 核心以及 Windows 应用程序或控制台项目的经验并帮助解决问题?

谢谢

【问题讨论】:

  • EF 不限于 ASP。您可以在控制台和桌面应用程序中使用它。
  • 你也可以分享你得到的“许多奇怪的错误”吗?
  • @GuruStron 你能以我使用它的方式显示一些对工作EF Core 的参考吗?我搜索了interent,但我没有找到任何东西
  • @GuruStron。这是其中之一:无法创建“ApplicationDbContext”类型的对象。有关设计时支持的不同模式,请参阅go.microsoft.com/fwlink/?linkid=851728
  • 我有一个GitHub repository,其中包含使用 MS-NorthWind 数据库修订版的 win 表单的代码示例。没有一个代码示例是真正的应用程序,而是为了展示什么是可能的。 Try this project 设置为显示具有即时更新的 DataGridView,具有 DataGridViewComboBox 列并允许排序。也可以在其他 26 个项目中寻找想法。请注意,没有迁移 - 代码首先存在的数据库。

标签: c# entity-framework asp.net-core entity-framework-core migration


【解决方案1】:

您可以在任何地方使用 EF Core。

创建一个控制台应用程序项目,然后安装这些包

  1. https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.SqlServer/3.1.9

  2. https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.Tools/3.1.9

并将连接字符串放入 OnConfiguringMethod。

 protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
  optionsBuilder.UseSqlServer("Server=serverName;Database=dbName;Trusted_Connection=True;MultipleActiveResultSets=True");
}

瞧,您可以在控制台应用程序中学习 ef core。因为 UI,他们只是用 ASP.NET Core 教 ef core。

我认为 Julie Lerman 在控制台应用程序中教授 EF Core,您可以使用 Pluralsight 平台进行 EF Core 教程。

【讨论】:

  • 谢谢亲爱的朋友,但是当我想add-migration 时,我收到了这个错误:无法创建“ApplicationDbContext”类型的对象。有关设计时支持的不同模式,请参阅go.microsoft.com/fwlink/?linkid=851728
  • 确保您的解决方案中只有一个项目,并在该项目中为 DbContext 创建一个自定义类。
  • 这是问题所在。我有 2 个项目:1 个类库和 1 个控制台应用程序。我的控制台应用程序引用了我的类库。为什么要限制?!
  • 这很奇怪,当您尝试添加-迁移检查在包管理器控制台中选择的项目时,您需要选择其中包含 DbContext 类的项目。
  • 是的,我之前检查过,我选择了我的类库项目
【解决方案2】:

这里有一些答案,以及我用来让我的 EF Core 工作的东西。

为什么 EF Core 仅限于 ASP.Net Core?世界上所有的项目都是用 ASP.Net Core 编写的吗?

它不仅限于 ASP.Net Core,EF Core 和 Core 本身只是一个控制台应用程序。并且并非所有工作中的项目都不是使用 ASP.NET Core 构建的——但是,由于它的灵活性,Microsoft 正在放弃对所有其他版本的 .Net 的支持。这意味着 .Net 的下一个版本实际上将是 .NetCore。如果您正在为普通的 .Net 应用程序构建,那么使用 EF 6 而不是 Core 可能会更好。 Core 只允许跨平台功能。

有没有人有使用 EF 核心以及 Windows 应用程序或控制台项目的经验并帮助解决问题?

是的,所有核心应用程序都是控制台项目。因此,如果您能够在 Windows 应用程序中执行此操作,那么您也可以在 Core 中执行此操作。


但是现在我将向您展示我的工作。我在一家公司工作并在多个项目中使用 EF Core,我的基本公式如下所示:

Nuget 包:

Microsoft.EntityFrameworkCore
Microsoft.EntityFrameworkCore.Design
Microsoft.EntityFrameworkCore.Relational

这是启动文件中的代码。请注意,它看起来与您的略有不同,因为我将 Dbcontext 放在与入口点不同的项目中。

public void ConfigureServices(IServiceCollection services)
{
    // Add the SQL db conneciton
    /*
        AddSQLContext is just a function in a different project. Not Needed
    */
    services.AddSQLContext(options => options.UseSqlServer(
    
        // This is simply the connection stirng
        Configuration.GetConnectionString("SqlConnection"),
        
        // We add a migration assembly only if the EF core DbContext is in another project
        actions => actions.MigrationsAssembly("My.Other.Project.Assembly")
    ));
                
}

我调用上下文的代码在另一个项目中。我喜欢把它分开。但你不必这样做。 这是我使用的 Nuget 包,但我认为工具和设计只有在执行 CodeFirst 方法时才需要(从 EF 核心而不是脚手架构建数据库):

Microsoft.EntityFrameworkCore
Microsoft.EntityFrameworkCore.Design
Microsoft.EntityFrameworkCore.SqlServer
Microsoft.EntityFrameworkCore.SqlServer.Design
Microsoft.EntityFrameworkCore.Tools

public static class ServiceCollectionExtentions
{
    /*
        SqlContext is my own custom context similar to your [ ApplicationDbContext ]
    */
    public static IServiceCollection AddSQLContext(this IServiceCollection services, Action<DbContextOptionsBuilder> options) => services
            .AddDbContext<SqlContext>(options);
            
}

public class SqlContext : DbContext
{
    public SqlContext(DbContextOptions options)
        : base(options){}

    
    ...
    
}

【讨论】:

  • 谢谢,但我有几个问题: 1) 在控制台应用程序中,Startup 类是什么? 2)我应该在哪里写ConfigureServices类? 3)我应该在哪里写ServiceCollectionExtentions类?
【解决方案3】:

解决方法很简单:为ApplicationDbContext添加默认构造函数:

public ApplicationDbContext()
{
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-27
    • 1970-01-01
    • 2017-07-09
    • 1970-01-01
    • 1970-01-01
    • 2010-11-04
    • 1970-01-01
    • 2011-01-07
    相关资源
    最近更新 更多