2016-08-11 125 views
2

在這個項目中,我試圖從.NET遷移到.NET Core。這裏我有一個我想在.NET Core中實現的代碼。如何修改DbContext base構造函數參數作爲被傳遞的參數?

public partial class CompanyFormsContext : DbContext 
{ 
    public CompanyFormsContext() 
     : base("name=CompanyFormsContext") 
    { 
    } 

    public CompanyFormsContext(string connName) 
     : base("name=" + connName) 
    { 
    } 
... 
} 

在.NET Core中,字符串不被接受爲DbContext的參數。相反,您可以將DbContextOptions作爲參數傳遞。例如,在下面的鏈接:http://ef.readthedocs.io/en/latest/miscellaneous/configuring-dbcontext.html

你可以看到的例子:

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

    public DbSet<Blog> Blogs { get; set; } 
} 

var optionsBuilder = new DbContextOptionsBuilder<BloggingContext>(); 
optionsBuilder.UseSqlite("Filename=./blog.db"); 

using (var context = new BloggingContext(optionsBuilder.Options)) 
{ 
    // do stuff 
} 

我想要做的是與此類似。我可能創建一個DbContextOptions實例並傳遞它,但我不知道如何修改SqlServer連接,因爲我通過基類構造函數傳遞它。

我弄不明白的最重要的事情是,我希望能夠保留我的空構造函數,這會觸發默認的「CompanyFormsContext」連接。如果我可以在將它作爲參數傳遞給CompanyFormsContext構造函數的同時簡單地更改連接名稱,那也很棒。

我正在考慮以下替代基礎構造函數的替代方法,但我更願意保留基礎構造函數。

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) 
    { 
     if (connName == null) 
     { 
      optionsBuilder.UseSqlServer(@"Server=.\;Integrated Security=True;Database=CompanyFormsContext"); 
     } 
     else 
     { 
      optionsBuilder.UseSqlServer(@"Server=.\;Integrated Security=True;Database=" + connName); 
     } 
    } 

回答

2

您可以創建它返回將從通過連接字符串來創建一個DbContextOptions<BloggingContext>的靜態方法。

所以,你的類可以是這個樣子:

public partial class CompanyFormsContext : DbContext 
{ 
    public CompanyFormsContext() 
     : base(CreateOptions(null)) 
    { 
    } 

    public CompanyFormsContext(string connName) 
     : base(CreateOptions(connName)) 
    { 
    } 

    private static DbContextOptions<BloggingContext> CreateOptions(string connName) 
    { 
     var optionsBuilder = new DbContextOptionsBuilder<BloggingContext>(); 
     optionsBuilder.UseSqlite("Filename=./blog.db"); 
     if (connName == null) 
     { 
      optionsBuilder.UseSqlServer(@"Server=.\;Integrated Security=True;Database=CompanyFormsContext"); 
     } 
     else 
     { 
      optionsBuilder.UseSqlServer(@"Server=.\;Integrated Security=True;Database=" + connName); 
     } 
     return optionsBuilder.Options; 
    } 
+0

因此,它不會像這樣一個不給我一個錯誤:http://rextester.com/LISAO70300?我一直在嘗試將方法傳遞給構造函數 –

+0

@KemalTezerDilsiz對不起,我寫了我們需要一個靜態方法,但是我忘記了代碼示例中的'static'關鍵字。我修好了它。 – Koopakiller

相關問題