【发布时间】:2021-04-27 06:49:46
【问题描述】:
在 Controller 中,我们可以这样做将 DbContext 注入到 Controller 中。这很好用。
public class HockeyPlayer : Controller
{
private readonly MyDbContext _context;
public HockeyPlayer(MyDbContext context)
{
_context = context;
}
}
但是;我从未做过的一件事是在类文件中注入(或访问)DbContext。
例如,假设我有一个名为 HockeyPlayerData 的类。
public class HockeyPlayerData
{
private readonly MyDbContext _context;
public HockeyPlayerData(MyDbContext context)
{
_context = context;
}
}
当我尝试使用 _context 时会引发错误(对象引用未设置为对象的实例)。
var db_query = _context.Set<HockeyPlayer>().FromSqlRaw("execute dbo.GetHockeyPlayer {0}, {1}", 0,
userid).ToList();
我可以让它工作的唯一方法是将 DbContext 传递给类或每个方法。 例如:
HockeyPlayerData hp = new HockeyPlayerData(_context);
hp.GetPlayerData();
或者
HockeyPlayerData hp = new HockeyPlayerData();
hp.GetPlayerData(_context);
我真的不喜欢这样,但我也不确定这是否一定是错误的。似乎每个班级 应该能够像控制器一样轻松访问数据库。我已经阅读了很多关于此的内容,但我还没有真正得到任何地方。有没有简单的方法可以做到这一点?
你们中的一些人想要更多的代码。这有帮助吗?我的意思是,基本上就是这样。你可以看到我正在尝试在顶部进行注射。但是当我运行应用程序时,当我尝试在 _dbcontext.Set 处使用数据(对象引用未设置为对象实例)填充模型(曲棍球运动员)时出现错误。
public class HockeyPlayerData
{
public static MyDbContext _dbcontext;
public HockeyPlayerData(MyDbContext db)
{
_dbcontext = db;
}
public string GetHockeyPlayerData(string userid)
{
string firstname = "";
var query = _dbcontext.Set<HockeyPlayer>().FromSqlRaw("execute
dbo.GetHockeyPlayer {0}, {1}", 0, Convert.ToInt32(userid)).ToList();
for (int i = 0; i < query.Count; i++)
{
firstname = query[i].FirstName;
}
return firstname;
}
}
【问题讨论】:
-
请发帖minimal reproducible example。将 DbContext 传递给服务是 100% 可能的,而且非常普遍。
-
同意@CamiloTerevinto,我们需要一些示例代码。您的 _context.Set
示例与上面的 HockeyPlayerData 不匹配,因此很难确切知道您要完成什么。 -
我更新了帖子。看看是否有帮助。请记住,如果我从控制器传入 DbCoontext,它工作正常。但是当我尝试注入时,它没有。
-
请添加一个完整的例子。首先如何获得 HockeyPlayerData 的实例?此外,该代码无法编译,因此edit 您的问题并包含从控制器到服务和调用的实际代码
标签: c# entity-framework .net-core dbcontext