Entity Framework Core - ForeingKey 显示空值
Entity Framework Core - ForeingKey show null values
我正在使用 ASP.NET Core 开发一个 Entity Framework,我正在 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 table 中看到属性 "alimento",如 "alimentocodAl"。
我正在尝试建模 "A food(ALIMENTO) has been eaten by an user(USUARIO)" 我有一个控制器,我从特定用户那里获取所有条目,但是当我使用 API 时,我在 USUARIO table(codAl 对 Alimento 的 Usuario foreing 键)显示空值,例如:
[{"id":1,"email":"mail","nombre":"nombre","alimento":null},
{"id":2,"email":"mail","nombre":"nombre","alimento":null},
{"id":3,"email":"mail","nombre":"nombre","alimento":null}]
这是不正确的,因为我的 table 中的这个列中有值。
执行控制器的代码是:
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 运行 in Windows 7.
能否请您尝试将 Alimanto 包含在以下内容中
ctx.usuarios.Include(b => b.alimento)
您仅从数据库中检索 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()
作为最后一个操作移动,因为它计算表达式。现在它将在检索数据之前过滤 table,而不是下载所有用户并在之后过滤。
尝试用这个例子映射:
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 table.
那里收到
[{"id":1,"email":"mail","nombre":"nombre","AlimentoId":1}]
创建外键字段"virtual"。更改
public Alimento alimento { get; set; }
以下
public virtual Alimento alimento { get; set; }
我正在使用 ASP.NET Core 开发一个 Entity Framework,我正在 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 table 中看到属性 "alimento",如 "alimentocodAl"。
我正在尝试建模 "A food(ALIMENTO) has been eaten by an user(USUARIO)" 我有一个控制器,我从特定用户那里获取所有条目,但是当我使用 API 时,我在 USUARIO table(codAl 对 Alimento 的 Usuario foreing 键)显示空值,例如:
[{"id":1,"email":"mail","nombre":"nombre","alimento":null},
{"id":2,"email":"mail","nombre":"nombre","alimento":null},
{"id":3,"email":"mail","nombre":"nombre","alimento":null}]
这是不正确的,因为我的 table 中的这个列中有值。
执行控制器的代码是:
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 运行 in Windows 7.
能否请您尝试将 Alimanto 包含在以下内容中
ctx.usuarios.Include(b => b.alimento)
您仅从数据库中检索 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()
作为最后一个操作移动,因为它计算表达式。现在它将在检索数据之前过滤 table,而不是下载所有用户并在之后过滤。
尝试用这个例子映射:
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 table.
那里收到[{"id":1,"email":"mail","nombre":"nombre","AlimentoId":1}]
创建外键字段"virtual"。更改
public Alimento alimento { get; set; }
以下
public virtual Alimento alimento { get; set; }