在 .net core 3.1 中,使用控制台 console 程序對 ef 實體並建立遷移


因為 console 程序非常干凈,所以從配置文件的讀取到數據庫配置都需要自己完成

1、讀取配置文件:

注:(1)需要自己在項目目錄中建立 appsettings.json 文件,或其它類型配置文件也可以,這里靈活處理;

(2)建立后記得將文件的生成選項設置為如果較新則復制到輸出目錄,便於修改更新。

/// <summary>
/// 初始化應用程序配置文件
/// </summary>
/// <returns></returns>
public static IConfigurationRoot InitConfiguration()
{
    var basePath = Directory.GetCurrentDirectory();
    var configBuilder = new ConfigurationBuilder()
        .SetBasePath(basePath)
        .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
        .AddEnvironmentVariables();
    var configuration = configBuilder.Build();

    Console.WriteLine("配置文件:");
    Console.WriteLine(Path.Combine(basePath, "appsettings.json"));

    return configuration;
}

轉自:https://www.cnblogs.com/xiaoyu369/p/9559237.html

2、配置數據庫:

注:(1)可以根據需求配置不同的數據庫使用程序;

(2)使用 options.MigrationAssembly 是因為實體數據集沒用和當前控制台程序在一個程序集中,需要指定遷移代碼執行的程序集。

/// <summary>
/// 初始化數據庫配置
/// </summary>
/// <param name="configuration">應用程序配置</param>
/// <returns></returns>
public static DbContextOptions<PsyDbContext> InitDatabase(IConfigurationRoot configuration)
{
    var connectionString = configuration.GetConnectionString("PSYDB");
    var optionsBuilder = new DbContextOptionsBuilder<PsyDbContext>();
    var dbType = configuration.GetValue<int>("DbType");
    switch (dbType)
    {
        case 1:
            optionsBuilder.UseSqlServer(connectionString, options => options.MigrationsAssembly("EfCoreMigrationTest"));
            break;
        case 2:
            optionsBuilder.UseMySql(connectionString);
            break;
        default:
            optionsBuilder.UseSqlite(connectionString);
            break;
    }
    var dbContextOptions = optionsBuilder.Options;

    Console.WriteLine($"數據庫[dbType:{dbType}]:");
    Console.WriteLine(connectionString);

    return dbContextOptions;
}

轉自:https://www.cnblogs.com/skyfreedom/archive/2019/07/10/11166399.html

3、測試調用:

class Program
{
    /// <summary>
    /// 應用程序配置對象
    /// </summary>
    public static IConfigurationRoot Configuration { get; private set; }

    /// <summary>
    /// 數據庫配置對象
    /// </summary>
    public static DbContextOptions<PsyDbContext> DbContextOptions { get; private set; }

    /// <summary>
    /// 獲取實體上下文
    /// </summary>
    public static PsyDbContext DbContext => new PsyDbContext(DbContextOptions);

    static async Task Main(string[] args)
    {
        // 初始化
        Configuration = InitConfiguration();
        DbContextOptions = InitDatabase(Configuration);

        // 具體使用代碼
        var userlist = await DbContext.UserInfo.Take(5).ToArrayAsync();

        // 輸出結果
        Console.WriteLine("檢查數據:");
        Console.WriteLine(JsonConvert.SerializeObject(userlist, Formatting.Indented));
        Console.ReadKey();
    }
}

4、配置文件(appsettings.json)內容:

{
  "ConnectionStrings": {
    "PSYDB": "Data Source=.;Initial Catalog=PSYDB;User ID=sa;Password=123456;Connect Timeout=15"
  },
  // 數據庫類型:0-sqlite,1-sqlserver,2:mysql
  "DbType": 1
}

5、實體上下文:定義就不在這里列出了,可參考第2步的文章鏈接,或其它 EF Core 文章。

6、使用 Fluent Api 來配置實體類:

原來的父類改為了接口:IEntityTypeConfiguration<>

繼續按原來 EF 的配置方法使用即可,記得在實體里重寫 OnModelCreating 方法中配置:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    var typesToRegister = Assembly.GetExecutingAssembly().GetTypes()
        .Where(t => t.GetInterface(typeof(IEntityTypeConfiguration<>).FullName) != null);

    foreach (var type in typesToRegister)
    {
        dynamic configurationInstance = Activator.CreateInstance(type);
        modelBuilder.ApplyConfiguration(configurationInstance);
    }
}

轉自:https://www.cnblogs.com/Zhang-Xiang/p/7580899.html

7、實體工廠類:

注:如果需要生成遷移代碼,以上代碼還不夠,還需要添加一個實體工廠類,便於設計工具在運行時可以通過此類實例化實體類型

/// <summary>
/// 實體工廠類,便於 EF 設計時工具創建實體上下文(可在程序包控制台中執行遷移初始化:Add-Migration InitialCreate)
/// </summary>
public class PsyDbContextFactory : IDesignTimeDbContextFactory<PsyDbContext>
{
    public PsyDbContext CreateDbContext(string[] args)
    {
        var configuration = Program.InitConfiguration();
        var options = Program.InitDatabase(configuration);
        return new PsyDbContext(options);
    }
}

轉自:https://stackoverflow.com/questions/56686093/unable-to-create-an-object-of-type-dbcontext

參考:https://docs.microsoft.com/zh-cn/ef/core/managing-schemas/migrations/

https://docs.microsoft.com/zh-cn/ef/core/miscellaneous/cli/dbcontext-creation

8、結束:

到此就完成了代碼的編寫,可以在 Visual Studio 的程序包控制台中,執行:Add-Migration InitialCreate 建立遷移了;

另外如果不想要遷移代碼了的話,一定要使用命令行(Remove-Migration)移除,不能簡單的刪除文件,否則后續的遷移代碼可能會不太對。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM