我正在使用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
如何从表中获取用户对象?
问候
首先,EF的约定将使用ClassName_Id查找FK,因此如果您将FK称为User,则称为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#对象。稍后您可能会发现自己遇到循环双向引用问题,序列化程序不会迭代或抛出异常。此外,通过传递实体,您向客户端发送的数据远远超过通常需要的数据,从而向用户公开有关您的数据的更多详细信息,而不是在屏幕上呈现。通过选择您需要显示的数据,您可以最大限度地减少有线负载的大小,保持敏感详细信息不受客户端调试器的影响,并可以优化查询性能。