为了账号安全,请及时绑定邮箱和手机立即绑定

Entity Framework Core - ForeingKey 显示空值

Entity Framework Core - ForeingKey 显示空值

C#
白猪掌柜的 2022-11-13 15:53:14
我正在使用 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 表中的 foreing 键( Usuario foreing key to Alimento by 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;}我有什么问题吗?这是针对使用在 Windows 7 中运行的 ASP.NET 和 Entity Framework Core 开发的 REST API。
查看完整描述

3 回答

?
湖上湖

TA贡献2003条经验 获得超2个赞

您仅从 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();

附言

ToList()作为最后一个操作移动,因为它评估表达式。现在它将在检索数据之前过滤表,而不是下载所有用户并在之后过滤。


查看完整回答
反对 回复 2022-11-13
?
不负相思意

TA贡献1777条经验 获得超10个赞

尝试使用此示例进行映射:


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


查看完整回答
反对 回复 2022-11-13
?
森林海

TA贡献2011条经验 获得超2个赞

您能否尝试将 Alimanto 包含在以下内容中

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


查看完整回答
反对 回复 2022-11-13
  • 3 回答
  • 0 关注
  • 82 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信