正如我所说的,我遇到了一个NullReference问题,其中数据库中已经有一条记录,但是该方法(无法访问它)并返回null。
我正在使用EntityFramework,CodeFirst方法。
我的班级职能人员
public class FonctionPersonnel
{
public int Id { get; set; }
[Required]
public String Nom { get; set; }
[Required]
public float Cote { get; set; }
}
我的BddContext:
public class BddContext1 : DbContext
{
public DbSet<Input> Inputs { get; set; }
public DbSet<FonctionPersonnel> FonctionsPersonnels { get; set; }
}
我的父亲:
private readonly BddContext1 bdd;
public Dal()
{
bdd = new BddContext1();
}
public void Dispose()
{
bdd.Dispose();
}
public float ObtenirCoeficient(int id)
{
var inputTrouve = bdd.Inputs.FirstOrDefault(input => input.Id == id); // Accessing the row that would be edited
String fonctionName = inputTrouve.Fonction; // fonctionName == "RESPONSABLE RESERVE"
var fonctionCote = bdd.FonctionsPersonnels.FirstOrDefault(p => p.Nom == fonctionName); // fonctionCote == null
return fonctionCote.Cote;
}
FonctionPersonnel转储: FonctionPersonnel database's dump
数据库中存在RESPONSABLE RESERVE,并获得了Cote,但是方法FirstOrDefault()返回null ...
为什么它返回null,而FonctionsPersonnels中已经存在RESPONSABLE RESERVE?
我暂时通过在数据库中再次添加带有其Cote的functionName来解决该问题,但是现在我得到了重复的FonctionPersonnel条目,这对我不起作用。
PS:我刚刚下载了Microsoft SQL Manager Studio,并启动了SQL Server Profiler(跟踪文件): https://files.fm/u/hjry7684
查看曲目:
exec sp_executesql N'SELECT TOP (1)
[Extent1].[Id] AS [Id],
[Extent1].[Nom] AS [Nom],
[Extent1].[Cote] AS [Cote]
FROM [dbo].[FonctionPersonnels] AS [Extent1]
WHERE [Extent1].[Nom] = @p__linq__0',N'@p__linq__0 nvarchar(4000)',@p__linq__0=N'CAISSIER'
答案 0 :(得分:2)
如果您在FonctionsPersonnels表中有一条记录,其中包含查询数据库时inputTrouve.Fonction
返回的确切字符串值,我不知道为什么它会返回null。您可能需要仔细调试,在运行时检查数据库记录,并使用 SQL Server Profiler 监视数据库查询,因为查询的记录可能会被其他内容修改。我还将建议使用using
关键字重新实现该方法:
public float ObtenirCoeficient(int id)
{
using (var context = new BddContext1())
{
var fonctionName = context.Inputs.FirstOrDefault(input => input.Id == id)?.Fonction;
return context.FonctionsPersonnels.FirstOrDefault(p => p.Nom == fonctionName).Cote;
}
}
答案 1 :(得分:1)
通过将以下调试语句添加到DataContext类构造函数中,您可以查看在“调试”窗口中执行的实际sql。将其粘贴到SQL Server中,看看为什么得到0行。
Database.Log = delegate (string str) { Debug.WriteLine(str); };
通常仅在Debug中使用,删除以用于生产部署或包装条件以仅在Debug中运行