使用实体框架获取对象在对象上返回 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的主要内容,如果未能解决你的问题,请参考以下文章
通过 Web 传输实体框架对象并通过 JSON 返回的最佳方式
通过findOneBy方法获取的Doctrine实体的行为与通常类似,但会触发致命错误