c# - 如何在传递时修改 DbContext 基本构造函数参数?

标签 c# asp.net .net entity-framework constructor

在这个项目中,我尝试从 .NET 迁移到 .NET Core。这里我有一段代码,我想在 .NET Core 中实现。

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);
        }
    }

最佳答案

您可以创建一个返回 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;
    }

关于c# - 如何在传递时修改 DbContext 基本构造函数参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38905152/

相关文章:

c# - 是否可以将音频文件和C#文件一起编译为单个exe?

c# - 无法在新的应用程序域中加载 C 模块

c# - 从自定义用户控件基类派生用户控件

c# - ASP.NET 反序列化 JSON 返回 Null

jquery - 使用 MVC 方法无法正确加载 jPlayer 歌曲

使用 Where 子句的 C# 结果序列

c# - 获取属性的参数和值

c# - ContentControl.ContentTemplateSelector 动态选择模板

c# - 文本到 Excel 中的列

c# - 为什么 C# 不对不可为空的长字段发出警告?