使用 Entity Framework 在对象上获取对象 returns null

Getting the object returns null on the object using Entity Framework

我正在使用 Entity Framework 访问 SQL 服务器数据库。

我对 table 行中的对象有疑问。

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 :(
}

但在 table 中,用户被分配...

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

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

此致

首先,EF 的约定将使用 ClassName_Id 查找 FK,因此如果您对用户的 FK 称为 User_Id,那么就涵盖了。您可以调用您的用户 属性 "User" 而不是 "User_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# 对象。稍后您可能会发现自己遇到序列化程序不会迭代或抛出异常的循环双向引用问题。此外,通过传递实体,您向客户端发送的数据远远超过它通常需要的数据,这会向用户公开比您可能在屏幕上呈现的数据更多的细节。通过仅选择您需要显示的数据,您可以最大限度地减少网络中的负载大小,对客户端调试器隐藏敏感细节,并可以优化查询性能。