实体框架核心-ForeingKey显示空值

时间:2019-03-26 11:51:14

标签: c# sql asp.net frameworks entity

我正在使用ASP.NET Core开发实体框架,并在SQL Express 2017和使用C#的REST API中构建数据库。

我有两个模型(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; }
}

当我迁移解决方案并更新数据库时,我可以在USUARIO表中看到属性“ alimento”,例如“ alimentocodAl”。

我正在尝试建模“用户已食​​用一种食物(ALIMENTO)(USUARIO)”。我有一个控制器,可以从特定用户那里获取所有条目,但是当我使用API​​时,我的前键USUARIO表(用codAl在Usuario中将前缀指向Alimento的表)显示空值,例如:

[{"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;
}

我错了吗?

这是针对使用Windows 7中运行的ASP.NET和Entity Framework Core开发的REST APi。

4 个答案:

答案 0 :(得分:0)

您能否尝试将Alimanto包括在内

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

答案 1 :(得分:0)

您仅从数据库中检索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()作为最后一个操作,因为它计算表达式。现在,它将在检索数据之前过滤表,而不是下载所有用户然后进行过滤。

答案 2 :(得分:0)

尝试通过以下示例进行映射:

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;}
    }

应该使用上面的代码创建一对多映射。 应该从Usario表中收到类似的信息。

[{"id":1,"email":"mail","nombre":"nombre","AlimentoId":1}] 

答案 3 :(得分:0)

使外键字段为“虚拟”。更改

public Alimento alimento { get; set; }

到以下

public virtual Alimento alimento { get; set; }