簡體   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