【问题标题】:Entity Framework Core - ForeingKey show null valuesEntity Framework Core - ForeingKey 显示空值
【发布时间】:2019-08-16 19:07:00
【问题描述】:

我正在使用 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”。

我正在尝试对“用户(USUARIO)已吃掉一种食物(ALIMENTO)”进行建模USUARIO 表(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;
}

我有什么问题?

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

【问题讨论】:

    标签: c# sql asp.net frameworks entity


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      您仅从数据库中检索 Usuario。如果您想获得任何其他信息,您需要使用Include

      代替行var user = ctx.usuarios.ToList().Where(b =&gt; b.email == email);

      你需要有var user = ctx.usuarios.Where(b =&gt; b.email == email).Include(usr =&gt; usr.alimento).ToList();

      附言

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

      【讨论】:

        【解决方案3】:

        尝试用这个例子来映射:

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

        【讨论】:

          【解决方案4】:

          使外键字段“虚拟”。改变

          public Alimento alimento { get; set; }
          

          到下面

          public virtual Alimento alimento { get; set; }
          

          【讨论】:

            猜你喜欢
            • 2022-08-02
            • 1970-01-01
            • 1970-01-01
            • 2020-09-25
            • 1970-01-01
            • 2020-03-29
            • 1970-01-01
            • 2017-10-19
            • 2018-04-07
            相关资源
            最近更新 更多