FirstOrDefault“ Faking”数据库

时间:2018-08-16 12:04:35

标签: c# asp.net

正如我所说的,我遇到了一个N​​ullReference问题,其中数据库中已经有一条记录,但是该方法(无法访问它)并返回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'

2 个答案:

答案 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中运行