我正在使用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
如何从表中获取用户对象?
致谢
答案 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#对象。稍后,您可能会发现自己遇到了循环双向引用的问题,而串行化器不会对其进行迭代或引发异常。此外,通过传递实体,您向客户端发送的数据要比通常发送的要多得多,这比向用户显示的数据详细信息要多得多。通过仅选择需要显示的数据,可以最大程度地减小线路上有效负载的大小,将敏感细节隐藏在客户端调试器中,并可以优化查询性能。