使用实体框架获取对象在对象上返回 null

Posted

技术标签:

【中文标题】使用实体框架获取对象在对象上返回 null【英文标题】:Getting the object returns null on the object using Entity Framework 【发布时间】:2019-09-18 12:46:59 【问题描述】:

我正在使用实体框架来访问 SQL Server 数据库。

我对表格行中的对象有疑问。

DB(实体代码优先):

public class User

    [Key]
    public int Id  get; set; 
    public Group Group_Id  get; set; 
    public string Alias  get; set; 
    public string Email  get; set; 
    public string Password  get; set; 
    public string Name  get; set; 
    public string Surname  get; set; 
    public string Company  get; set; 


public class SMAccount

    [Key]
    public int Id  get; set; 
    public User User_Id  get; set;  //there he is
    public string Type  get; set; 
    public string AId  get; set; 

使用(使用 Razor 查看):

var smAcc = db.SMAccounts.FirstOrDefault(x => x.User_Id.Id.Equals(userID));
if (smAcc != null)

    <span>FB account: </span>@smAcc.AId <br /> //return accountID
    <span>User: </span>@smAcc.User_Id          //return null :(

但在表格中分配了用户...

ID | type | AId | User_Id_Id
2  | fbu  | 227 | 1

如何从表中获取用户对象?

问候

【问题讨论】:

【参考方案1】:

首先,EF 的约定将使用 ClassName_Id 查找 FK,因此,如果您是 User 的 FK,则称为 User_Id,那么这已涵盖。您可以将您的用户属性称为“用户”而不是“用户 ID”,我认为这会造成混淆,因为它暗示了用户的“ID”,而不是用户。

public class SMAccount

    [Key]
    public int Id  get; set; 
    public User User  get; set; 
    public string Type  get; set; 
    public string AId  get; set; 

然后在使用其用户检索帐户时,使用.Include() 告诉 EF 急切加载相关实体。

var smAcc = db.SMAccounts.Include(x => x.User).FirstOrDefault(x => x.User.Id.Equals(userID));

我不建议从 Razor 视图中执行此操作。而是调用控制器以检索可以从实体填充的简单 C# 对象。稍后您可能会发现自己遇到循环双向引用的问题,序列化程序不会迭代或抛出异常。此外,通过传递实体,您向客户端发送的数据远远超过它通常需要的数据,这向用户展示了比您在屏幕上呈现的更多的数据细节。通过选择您需要显示的数据,您可以最大限度地减少网络中的有效负载大小,让客户端调试器隐藏敏感细节,并且可以优化查询性能。

【讨论】:

哦!它的工作原理:D 错误是命名......但包括使用字符串:3 这应该看起来像这样:.Include("User") 我通常不在“剃须刀”中使用 dbconnect。这里我只是做一个测试。默认会传输到控制器 啊,是的,.Include(string) 变体默认可用,.Include(lambda) 需要 using 声明来公开扩展方法。 (EF6 的 System.Data.Entity,EF Core 的 Microsoft.EntityFrameworkCore)

以上是关于使用实体框架获取对象在对象上返回 null的主要内容,如果未能解决你的问题,请参考以下文章

发布应用程序时实体返回 null

通过 Web 传输实体框架对象并通过 JSON 返回的最佳方式

通过findOneBy方法获取的Doctrine实体的行为与通常类似,但会触发致命错误

实体框架:如何从 L2E 返回基本类型

Spring Data JPA:查询如何返回非实体对象或对象列表?

从空列返回实体后出现空指针异常