使用Entity Framework获取对象在对象上返回null

问题描述 投票:0回答:1

我正在使用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

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

问候

c# asp.net entity-framework code-first
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.