Entity Framework Core - ForeingKey показывает нулевые значения - PullRequest
0 голосов
/ 26 марта 2019

Я занимаюсь разработкой Entity Framework с ASP.NET Core и создаю базу данных в SQL Express 2017 и API REST с использованием C #.

У меня есть две модели (Usuario и Alimento):моя модель Alimento:

public class Alimento{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int codAl { get; set; }

[Required(ErrorMessage = "Se requiere de una denominacion")]
[StringLength(50, MinimumLength = 2)]
public string Descripcion { get; set; }

public string Cantidad { get; set; }

[Required(ErrorMessage = "Calorias es imprescindible")]
[DataType(DataType.Currency)]
[Range(1, 999, ErrorMessage = "El rango debe estar entre 1 y 999")]
public int Calorias { get; set; }
    }

, и это моя модель Usuario:

public class Usuario{
public int Id { get; set; }
public string email { get; set; }

[Required(ErrorMessage = "Se requiere de una denominacion")]
[StringLength(50, MinimumLength = 2)]
public string nombre { get; set; }

public Alimento alimento { get; set; }
}

Когда я переносу решение и обновляю базу данных, я вижу атрибут "alimento" в USUARIOтаблица типа "alimentocodAl".

Я пытаюсь смоделировать "Еда (ALIMENTO) была съедена пользователем (USUARIO)" У меня есть контроллер, который я получаю все записи от конкретного пользователя, но когда я использую API, мойключ foreing в таблице USUARIO (ключ foreu Usuario для Alimento от codAl) показывает нулевые значения, например:

[{"id":1,"email":"mail","nombre":"nombre","alimento":null}, 
{"id":2,"email":"mail","nombre":"nombre","alimento":null}, 
{"id":3,"email":"mail","nombre":"nombre","alimento":null}]

Это неверно, так как у меня есть значения в этом столбце внутри моей таблицы.

Код, который выполняет контроллер:

public IEnumerable<Usuario> GetInfoUsuario(string email)
{
    var user = ctx.usuarios.ToList().Where(b => b.email == email);
    return user;
}

Что я не так?

это для REST APi, разработанного с ASP.NET и Entity Framework Core, работающим в Windows 7.

Ответы [ 4 ]

0 голосов
/ 26 марта 2019

Сделать поле внешнего ключа "виртуальным". Изменить

public Alimento alimento { get; set; }

до следующего

public virtual Alimento alimento { get; set; }
0 голосов
/ 26 марта 2019

Вы получаете только Usuario из базы данных. Если вы хотите получить дополнительную информацию, вам нужно использовать Include.

вместо строки var user = ctx.usuarios.ToList().Where(b => b.email == email);

Вам нужно иметь var user = ctx.usuarios.Where(b => b.email == email).Include(usr => usr.alimento).ToList();

P.s

Я переместил ToList() как последнюю операцию, потому что она вычисляет выражение. Теперь он будет фильтровать таблицу перед извлечением данных вместо загрузки всех пользователей и последующей фильтрации.

0 голосов
/ 26 марта 2019

Попробуйте сопоставить с этим примером:

public class Usuario{
public int Id { get; set; }
public string email { get; set; }

[Required(ErrorMessage = "Se requiere de una denominacion")]
[StringLength(50, MinimumLength = 2)]
public string nombre { get; set; }

[ForeignKey("alimento")]
public int AlimentoId {get; set;}

public virtual Alimento alimento { get; set; }
}


public class Alimento{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int codAl { get; set; }

[Required(ErrorMessage = "Se requiere de una denominacion")]
[StringLength(50, MinimumLength = 2)]
public string Descripcion { get; set; }

public string Cantidad { get; set; }

[Required(ErrorMessage = "Calorias es imprescindible")]
[DataType(DataType.Currency)]
[Range(1, 999, ErrorMessage = "El rango debe estar entre 1 y 999")]
public int Calorias { get; set; }

public virtual ICollection<Usario> Users {get; set;}
    }

Правильное сопоставление один-ко-многим должно быть создано с кодом выше. Нечто подобное должно быть получено из таблицы Усарио.

[{"id":1,"email":"mail","nombre":"nombre","AlimentoId":1}] 
0 голосов
/ 26 марта 2019

Не могли бы вы попытаться включить Алиманто в качестве следующего

ctx.usuarios.Include(b => b.alimento)
...