使用Entity Framework获取对象时,该对象返回null

时间:2019-04-29 21:29:23

标签: c# asp.net entity-framework code-first

我正在使用Entity Framework访问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 个答案:

答案 0 :(得分:0)

首先,EF的约定将使用ClassName_Id查找FK,因此,如果您对User的FK称为User_Id,则将其覆盖。您可以将您的User属性命名为“ User”,而不是“ User_Id”,我认为这会造成混淆,因为它暗示了User(而非用户)的“ 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#对象。稍后,您可能会发现自己遇到了循环双向引用的问题,而串行化器不会对其进行迭代或引发异常。此外,通过传递实体,您向客户端发送的数据要比通常发送的要多得多,这比向用户显示的数据详细信息要多得多。通过仅选择需要显示的数据,可以最大程度地减小线路上有效负载的大小,将敏感细节隐藏在客户端调试器中,并可以优化查询性能。