从EF到EF Core,如何正确使用using语句?

时间:2018-05-27 18:37:46

标签: c# entity-framework-core

我必须在我的上下文中做错了我有我的上下文,我想在我的经理课程中结束。我希望能够使用using语句,以便我的上下文只使用一次。

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

    public DbSet<JobsList> JobListingss { get; set; }
    public DbSet<Clients> ClientListings { get; set; }
    public DbSet<Engineer> EngineerListing { get; set; }

    public DbSet<Case> CasesListing { get; set; }
}

但是当我想在我的使用声明中使用我的上下文时,例如

public class xxxContext
{
    xxxDbContext _db = new xxxDbContext();

    public List<Case> GetAllCases(int databaseId)
    {
        List<Case> q = new List<Case>();

        using (var myContext = new xxxDbContext(what must I reference here ?)))
        {
            q = myContext.Cases
                         .Where(w => w.databaseID == databaseId)
                         .OrderBy(o => o.CustomerName).ToList();
        }

        return q;
    }
}

在我能够创建一个参数较少的构造之前,我可以在这里为核心执行相同操作,或者是否覆盖了要执行的操作。

另外,对于所有这些函数,我应该有一个单独的类,还是应该根据我的上下文设置一个部分类?

1 个答案:

答案 0 :(得分:1)

您需要使用DbContextoptionsBuilder<T>泛型类来获取选项实例:

var optionsBuilder = new DbContextOptionsBuilder<xxxDbContext>();

现在你必须使用创建的实例在构造函数中传递:

using (var myContext = new xxxDbContext(optionsBuilder.Options)))
{
  // code here
}   

修改

所以你需要的是首先在服务中配置服务以获取选项,如:

public void ConfigureServices(IServiceCollection services)
{
    // using sqlite as example via official docs example
    services.AddDbContext<xxxDbContext>(options => options.UseSqlite("Data Source=blog.db"));
}

然后在需要创建dbContext的代码中,您可以解决它:

var options = serviceProvider.GetService<DbContextOptions<xxxDbContext>>();

现在将它传递给构造函数中的Context类对象创建时间:

var options = serviceProvider.GetService<DbContextOptions<xxxDbContext>>();
using (var myContext = new xxxDbContext(options)))
{
  // code here
}  

有关官方文档的详细信息,请参阅以下帖子:

Configuring a DbContext