【问题标题】:How to modify DbContext base constructor parameter as its being passed?如何在传递 DbContext 基本构造函数参数时对其进行修改?
【发布时间】:2016-08-11 20:03:00
【问题描述】:

在这个项目中,我尝试从 .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);
        }
    }

【问题讨论】:

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


    【解决方案1】:

    您可以创建一个返回 DbContextOptions&lt;BloggingContext&gt; 的静态方法,该方法将从传递的连接字符串创建。

    所以你的班级可能看起来像这样:

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

    【讨论】:

    • 所以它不会像这样给我一个错误:rextester.com/LISAO70300 ?我一直在尝试尝试将方法传递给构造函数
    • @KemalTezerDilsiz 抱歉,我写了我们需要一个静态方法,但我忘记了代码示例中的 static 关键字。我修好了。
    猜你喜欢
    • 2015-03-23
    • 1970-01-01
    • 1970-01-01
    • 2013-11-15
    • 2021-02-02
    • 2019-01-06
    • 2023-04-04
    • 1970-01-01
    相关资源
    最近更新 更多