我正在使用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。
答案 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; }