我无法弄清楚为什么会这样。我为一家医疗公司准备了两张桌子(现在,完成后我会有两张以上)。主表被调用NPPR_Provider,它拥有一个外键NPPR_Header。这是一对一的关系,每个提供者只有一个标头。
现在我有一个简单的控制台应用程序来使用实体框架读取数据库,我打算稍后,一旦我知道我已经正确构建了模型,在 ASP.NET MVC 应用程序中使用它们。
我可以毫无问题地连接NPPR_Provider并从中获取数据。这工作正常。连接字符串和模型等都在工作。但是NPPR_Header不断出现null,我不知道为什么。
这两个表都存在于数据库(SQL Server)中,如下所示:
[AD].[NPPR_Provider]
[AD].[NPPR_Header]
NPPR_Provider 模型:
namespace Company.Name.Application.Models
{
[Table("NPPR_Provider", Schema ="AD")]
public class NPPR_Provider
{
[Key]
public int NPPRProvId { get; set; }
public int NPPRFileId { get; set; }
public virtual NPPR_Header NPPR_Header { get; set; }
public string First { get; set; }
public string Middle { get; set; }
//... and more column names I won't bore you with
}
public class NPPR_ProviderContext : DbContext
{
private string _state;
public NPPR_ProviderContext(string state)
{
_state = state.ToUpper();
}
public DbSet<NPPR_Provider> NPPR_Provider { get; set; }
public DbSet<NPPR_Header> NPPR_Header { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(
$"server=DEVSERVER;database=DataBaseName_{_state};trusted_connection=true;");
}
}
}
NPPR_Header
namespace Company.Name.Application.Models
{
[Table("NPPR_Header", Schema = "AD")]
public class NPPR_Header
{
[Key]
public int NPPRFileId { get; set; }
public string FileName { get; set; }
}
}
以及使用它的代码,在class SQLUtilities:
public static string test()
{
using (var db = new NPPR_ProviderContext("ks"))
{
if (db.Database.CanConnect())
{
var npprFile = db.NPPR_Provider
.Where(provider => provider.First == "Bob");
int count = 0;
foreach(var result in npprFile)
{
Console.WriteLine(result.NPPR_Header.FileName);
count++;
}
return $"Complete, {count} records found";
}
else
{
return "Failed to connect";
}
}
}
上面我试图模拟我的应用程序需要执行的部分操作,通过提供程序名称查询数据库并获取我需要提供给用户的特定 JSON 文件的文件名。
控制台应用程序(一旦我知道我的模型可以工作,我打算将其丢弃):
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(SqlUtilities.test());
Console.ReadLine();
}
}
}
现在有了数据,因为 SQL 中该test()方法的逻辑等价物是:
SELECT h.FileName FROM AD.NPPR_Provider p
INNER JOIN AD.NPPR_Header h
ON p.NPPRFileId = h.NPPRFileId
WHERE p.First = 'Bob';
它为我提供了 60 多条记录,其中包含我正在寻找的所有文件名。外键和主键在表中就位 C# 代码给了我相同数量的记录,但它们都是空的。代码崩溃(如果我尝试像上面那样访问 FileName 属性)并明确指出错误
Company.Name.Application.Models.NPPR_Provider.NPPR_Header.**get** returned null.
我不知道为什么 NPPR_Header 为空。连接字符串有效,我可以从 NPPR_Provider 获取信息。 NPPR_Provider不为空。外键和 NPPR_Header 属性位于 NPPR_Provider 上。它们也存在于数据库中。
这可能是非常愚蠢的事情,我是 Entity Framework 的新手,我已经阅读了多篇文章和 Stack Overflow 问题,但我错过了一些东西。