繁体   English   中英

将 Entity Framework Core 3.1 与 Windows 应用程序或控制台应用程序一起使用

[英]Using Entity Framework Core 3.1 with Windows Application or Console Application

我只是在学习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 不包含 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 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 教程。

以下是一些答案,以及我用来让我的 EF Core 工作的内容。

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

它不限于 ASP.Net Core,EF Core 和 Core 本身只是一个控制台应用程序。 并不是所有的项目都不是用 ASP.NET Core 构建的——但是,由于它的灵活性,微软正在放弃对所有其他版本的 .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){}

    
    ...
    
}

解决方案非常简单:只需为ApplicationDbContext添加默认构造函数:

public ApplicationDbContext()
{
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM