簡體   English   中英

從動態導入的DLL加載EF Core 2 DbContext

[英]Load EF Core 2 DbContext from dynamically imported DLL

我有一個DbContext我需要從DLL動態加載,因為Db上下文將更改並需要在應用程序運行時進行編輯,但是我似乎無法創建此上下文的實例,因為我似乎需要傳入上下文選項。 這段代碼如下。

Assembly reporting = Assembly.LoadFile(pathString);

        var defaultContext = reporting.GetType("Reporting.DefaultContext");
        var dbContext = Activator.CreateInstance(defaultContext, new
 object[] { /*need to pass in the contructor here*/ }) as DbContext;

我的編譯上下文非常標准,下面的修改版本供參考

public class DefaultContext : DbContext
{
    public DefaultContext(DbContextOptions<DefaultContext> options)
        : base(options)
    { }

    public virtual DbSet<Student> Students { get; set; }
    public virtual DbSet<Course> Courses { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Student>().ToTable("Students ", "core")
            .AllProperties().ForEach(x => x.IsRequired());

        modelBuilder.Entity<Course>().ToTable("Courses", "core")
            .AllProperties().ForEach(x => x.IsRequired());
    }
}

談到反思時我很缺乏經驗 - 所以問題確實存在;

這是嘗試實現此目的的最佳方法,還是應該創建一個方法來調用DLL來返回上下文?

如果不是,當我沒有上下文時,如何通過DbContextOptions實例進行傳遞?

旁注,這是一個Asp.Net Core 2.0 MVC項目。

編輯:當我將一個空的obj數組傳遞給create實例時,我得到一個缺少的方法異常(找不到構造函數)

var dbContext = Activator.CreateInstance(defaultContext, new object[] { new object[0] }) as DbContext;

然而,如果我沒有傳入第二個obj參數,我得到相同的異常,但是消息“沒有為此對象定義無參數構造函數”,所以現在我很丟失,因為顯然有一個construtor。

基本上問題是如何通過反射創建/獲取DbContextOptions<DefaultContext>實例。 您可以通過首先通過MakeGenericType構造泛型類型,然后將該類型用作Activator.CreateInstance參數來實現。

所以有

var dbContextType = reporting.GetType("Reporting.DefaultContext");

這樣的事情:

var optionsType = typeof(DbContextOptions<>).MakeGenericType(dbContextType);
var options = (DbContextOptions)Activator.CreateInstance(optionsType);
var dbContext = (DbContext)Activator.CreateInstance(dbContextType, options);

但是, DbContextOptions<TDbContext> options構造函數參數的整個目的是允許從外部配置db上下文(如數據庫提供程序,連接字符串等),而不是在OnModelConfiguring內部自我配置,在這種情況下,派生的db上下文將只需要無參數構造函數。

因此,最好創建DbContextOptionsBuilder<DefaultContext實例,使用Fluent DbContextOptionsBuilder<DefaultContext進行配置,然后將Options屬性(這是預期的DbContextOptions<DefaultContext類型)傳遞給DefaultContext構造函數。 例如

var optionsBuilderType = typeof(DbContextOptionsBuilder<>).MakeGenericType(dbContextType);
var optionsBuilder = (DbContextOptionsBuilder)Activator.CreateInstance(optionsBuilderType);

string connectionString = ...;
optionsBuilder.UseSqlServer(connectionString);

var dbContext = (DbContext)Activator.CreateInstance(dbContextType, optionsBuilder.Options);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM