c# dbcontext一直返回null,尽管数据在数据库中可用



我的API端点如下所示:

[HttpGet("{language}")]
public async Task<IActionResult> GetAllClozeWords(string language)        
{
var clozes = await GetClozesForLanguage<Cloze>(language);

if (clozes.IsNullOrEmpty())
{
return BadRequest();
}

return Ok();
}
private async Task<List<T>> GetClozesForLanguage<T>(string language) where T : Cloze 
{
switch (language.ToLower())
{
case "nl":
return await this._trackerDbContext.NLclozes.ToListAsync() as List<T>;
case "en":
return await this._trackerDbContext.ENclozes.ToListAsync() as List<T>;
default:
return new List<T>();
}
}

和实体框架模型,如下所示:

public abstract class Cloze
{
public int Id { get; set; }
public string cloze_word { get; set; }
}
public class NLcloze : Cloze
{
public string note1 { get; set; }
public string note2 { get; set; }
public string note3 { get; set; }
public virtual ICollection<NLexpression> NLexpressions { get; set; }
public virtual ICollection<ENcloze> ENclozes { get; set; }
}
public class ENcloze : Cloze
{
public string note1 { get; set; }
public string note2 { get; set; }
public string note3 { get; set; }
public virtual ICollection<ENexpression> ENexpressions { get; set; }
public virtual ICollection<NLcloze> NLclozes { get; set; }
}

当我使用适当的language参数(例如nl)的get请求到达端点时,我在switch语句返回时继续获得null,尽管我已经仔细检查了数据库内是否有数据。

有谁知道我哪里错了吗?

这可能不是最好的答案,我不能评论,但希望对你有所帮助:

是"ToListAsync()";每个人都能带回数据吗?如果是这样,问题就出在选角上了。如果没有,您可以查看其他问题,例如与DB的连接。

因此将函数更改为,看看您是否从DB获得任何返回。

private async Task<List<T>> GetClozesForLanguage<T>(string language) where T : Cloze 
{
switch (language.ToLower()){
case "nl":
var nl = await this._trackerDbContext.NLclozes.ToListAsync();
return nl as List<T>;
case "en":
var en = await this._trackerDbContext.ENclozes.ToListAsync();
return en as List<T>;
default:
return new List<T>();
}
}

我想说这里不需要通用实现,可能会给您带来麻烦。至少你应该用断点检查你的case场景是否被击中,以及读取的值是否符合你的期望。

也就是说,在继承中不需要泛型强制转换:

private async Task<List<Cloze>> GetClozesForLanguage(string language) 
{
switch (language.ToLower())
{
case "nl":
return await _trackerDbContext.NLclozes.ToListAsync();
case "en":
return await _trackerDbContext.ENclozes.ToListAsync();
default:
return new List<Cloze>();
}
}
在这样的设计中,你会遇到的一个问题是将相关数据加载/使用到最终的完形填空中。例如每种类型(En &Nl)具有相关数据的导航属性。上面的方法并不急于加载这个(如果有相当多的数据,也不应该这样做),这意味着这些导航属性(nlexpressions/EnExpressions/等)要么为#null,要么为惰性加载。这将是你的设计和你打算如何使用返回的信息时要小心的事情。

我个人建议外部化对语言类型的检查,只是去适当的NlClozes或EnClozes DbSets,以便调用者可以投影或进一步急切加载相关数据,因为他们需要,而不是试图返回这些数据作为"clozes";当他们需要相关数据时,再重新铸造。