Получение объекта возвращает нуль для объекта с использованием Entity Framework - PullRequest
0 голосов
/ 30 апреля 2019

Я использую Entity Framework для доступа к базе данных SQL Server.

У меня проблема с объектом в строке таблицы.

БД (сначала код сущности):

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 голосов
/ 30 апреля 2019

Во-первых, соглашение для EF будет искать FK с использованием ClassName_Id, поэтому, если вы FK для пользователя называется User_Id, то это покрыто. Вы можете назвать свое свойство User «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 #, который можно заполнить из сущностей. Позже вы, вероятно, столкнетесь с проблемами с циклическими двунаправленными ссылками, которые сериализатор не будет выполнять итерацию или исключение. Кроме того, передавая объекты, вы отправляете клиенту гораздо больше данных, чем обычно требуется, что предоставляет пользователям больше подробностей о ваших данных, чем вы можете отобразить на экране. Просто выбирая данные, которые нужно отобразить, вы минимизируете размер полезной нагрузки по проводам, скрываете конфиденциальные данные от отладчиков на стороне клиента и можете оптимизировать производительность запросов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...