C# 在Windows应用程序或控制台应用程序中使用Entity Framework Core 3.1

C# 在Windows应用程序或控制台应用程序中使用Entity Framework Core 3.1,c#,entity-framework,asp.net-core,entity-framework-core,migration,C#,Entity Framework,Asp.net Core,Entity Framework Core,Migration,我正在学习实体框架核心3.1。我想知道为什么所有的学习内容都是使用ASP.Net核心学习的!!因此,我决定在类库以及控制台应用程序上测试一些代码。这是我非常简单的类库代码: public class ApplicationDbContext : DbContext { private static readonly string ConnectionString = "Server=.;Database=Northwind;Trusted_Connection=True;&qu

我正在学习
实体框架核心3.1
。我想知道为什么所有的学习内容都是使用ASP.Net核心学习的!!因此,我决定在
类库
以及
控制台应用程序
上测试一些代码。这是我非常简单的类库代码:

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());
    }
}
问题是
IHostBuilder
ConfigureWebHostDefaults
用于
ASP.Net核心及其依赖项注入引擎。因此,基于以下链接,我更改了我的
csproj
文件:

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

public static IHostBuilder CreateHostBuilder(string[] args)
                    => Host.CreateDefaultBuilder(args)
                        .ConfigureWebHostDefaults(
                            webBuilder => webBuilder.UseStartup<Startup>());
公共静态IHostBuilder CreateHostBuilder(字符串[]args)
=>Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(
webBuilder=>webBuilder.UseStartup());
以及:

公共类启动
{
public void配置服务(IServiceCollection服务)
=>services.AddDbContext();
public void配置(IApplicationBuilder应用程序、IWebHostEnvironment环境)
{
}
}
我对这些问题有一些疑问:

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

  • 是否有人有使用EF core和Windows应用程序或控制台项目的经验,并帮助解决这些问题


  • 谢谢

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

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

  • 并将连接字符串放入OnConfiguringMethod中

     protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
      optionsBuilder.UseSqlServer("Server=serverName;Database=dbName;Trusted_Connection=True;MultipleActiveResultSets=True");
    }
    
    瞧,你们可以在控制台应用程序中学习ef core。由于用户界面的原因,他们只使用ASP.NET core教授ef core


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

    以下是一些答案,以及我用来让EF Core工作的方法

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

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

    是否有人有使用EF core和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 core而不是脚手架构建数据库)时才是必要的:


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

    public ApplicationDbContext()
    {
    }
    

    EF不限于ASP。你可以在控制台和桌面应用程序中使用它。你也可以分享你得到的“许多奇怪的错误”吗?@Guruston你能以我使用它的方式展示一些关于work
    EF Core
    的参考吗?我搜索了一下因特网,但没有找到thing@GuruStron. 这是其中之一:无法创建“ApplicationDbContext”类型的对象。对于设计时支持的不同模式,请参阅我有一个使用MS NorthWind数据库修订版的win表单代码示例。所有的代码示例都不是为了真正的应用程序,而是为了展示什么是可能的。它设置为显示带有即时更新的DataGridView,具有DataGridViewComboBox列并允许排序。在其他26个项目中寻找创意。注意,没有迁移-先编码现有数据库。谢谢亲爱的朋友,但是当我想
    添加迁移时,我遇到了以下错误:无法创建“ApplicationDbContext”类型的对象。有关设计时支持的不同模式,请参阅确保解决方案中只有一个项目,并在该项目中为DbContext创建自定义类。这就是问题所在。我有两个项目:一个类库和一个控制台应用程序。我的控制台应用程序对我的类库的引用。为什么是限制?!这很奇怪,当您尝试添加迁移检查在Package manager控制台中选择的项目时,您需要选择其中包含DbContext类的项目。是的,我以前检查过,并选择了我的类库项目谢谢,但我有几个问题:1)在控制台应用程序中,什么是
    启动
    类?2) 我应该在哪里编写
    ConfigureServices
    class?3) 我应该在哪里编写
    servicecolectionextensions
    class?
    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")
        ));
                    
    }
    
    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){}
    
        
        ...
        
    }
    
    public ApplicationDbContext()
    {
    }