微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

“字段列表”中的未知列“a.addresscod_address” - C#

如何解决“字段列表”中的未知列“a.addresscod_address” - C#

朋友们,它有一个“person”表,它记录了用户的信息。现在我创建了一个“地址”表来存储用户的地址信息。

现在我需要重新组织我的代码,因为我遇到了关系问题。这些是我的文件

Person.cs

using LojaVirtual.Libraries.Lang;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Threading.Tasks;

namespace LojaVirtual.Models
{
    public class person
    {
        /* PK */
        [Key]
        public int cod_person { get; set; }

        public string name { get; set; }
        public DateTime date { get; set; }
        public string gender{ get; set; }
        .
        .
        public string email { get; set; }
        public string password { get; set; }
        public addres addres { get; set; }
        
        [ForeignKey("cod_person")]
        public virtual ICollection<order> Order { get; set; }
    }
}

地址.cs

using System;
using System.Collections.Generic;
using LojaVirtual.Libraries.Lang;
using System.Linq;
using System.Threading.Tasks;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace LojaVirtual.Models
{
    public class address
    {
        [Key]
        public int cod_address{ get; set; }

        public string { get; set; }
        public string neighborhood{ get; set; }

        public string city { get; set; }
        public string state{ get; set; }
        .
        .

        [ForeignKey("person")]
        public int? cod_person { get; set; }

        public person person { get; set; }
    }
}

LojaVirtualContext.cs


using LojaVirtual.Models;
using LojaVirtual.Models.ProdutoAgregador;
using Pomelo.EntityFrameworkCore.MysqL;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;


namespace LojaVirtual.Database
{
    public class LojaVirtualContext : DbContext
    {
        /*
         * EF Core - ORM
         * ORM -> Bibliteca mapear Objetos para Banco de Dados Relacionais
         */
        public LojaVirtualContext(DbContextOptions<LojaVirtualContext> options) : base(options)
        {

        }
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<person>()
                .HasOne<address>(s => s.address)
                .WithOne(ad => ad.person)
                .HasForeignKey<address>(ad => ad.cod_person);

        }
        public DbSet<person> person { get; set; }
        public DbSet<order> order{ get; set; }
        public DbSet<address> addres { get; set; }
    }
}

在这一行,我收到一个无法解决错误

public List<order> ObterTodosPedidosPorSituacao(string status)
{
 return _banco.order
       .Include(a => a.order_situation)
       .Include(a => a.person)
       .ThenInclude(p => p.address)
       .Where(a => a.Situation == status).ToList();}

我需要通过person表访问地址表的字段。我相信就是这样,但我收到错误

MysqL.Data.MysqLClient.MysqLException: '字段列表'中的'未知列'a.addresscod_address'

我也试过:a.person.address,但出现同样的错误

如果有人可以分析,我很感激。

解决方法

这应该有效:

public List<order> ObterTodosPedidosPorSituacao(string status)
{
    return _banco.order
       .Include(a => a.order_situation)
       .Include(a => a.person)
       .ThenInclude(p => p.address)
       .Where(a => a.Situation == status).ToList();
}

但我只是猜测,因为并非所有代码都包含在内。如果我能提出一些建议 - 在 c# 中存在严格的 naming convention。这没什么大不了的,但它有助于团队合作:)

编辑:我发现数据注释有其他问题。 [ForeignKey("cod_person")] - 这是多余的。更改后记得进行数据库迁移。

,

您的关系配置错误

<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.4/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.4/umd/react-dom.production.min.js"></script>

<div id="react"></div>

最后一行的 modelBuilder.Entity<person>() .HasOne<address>(s => s.address) .WithOne(ad => ad.person) .HasForeignKey<person>(ad => ad.cod_person); // <-- problem: ad is person 的类型是 ad 泛型类型参数的类型。你应该这样读 - HasForeignKey 的泛型类型参数是实体类型包含外键。

那么你在这里做什么实质上是配置 HasForeignKey 实体的​​ PK 也用作 person 的 FK,这使 address 中的预期 FK 无效(因为 fluent配置具有更高的优先级/覆盖约定和数据注释)。

话虽如此,只需通过更改泛型类型参数将 address 映射为一对一关系的依赖实体(具有 FK 的实体):

address

还要考虑删除(并在一般情况下避免).HasForeignKey<address>(ad => ad.cod_person); 属性。根据应用的位置,它们具有不同的语义(在导航属性上指定关联的 FK 属性名称,在 FK 属性上指定关联的导航属性名称)并且很容易像您的情况一样搞砸:

ForeignKey

应该是

[ForeignKey("cod_person")] // <-- wrong,points to self
public int? cod_person { get; set; }
public person person { get; set; }

[ForeignKey("person")] // the name of the below navigation property
public int? cod_person { get; set; }
public person person { get; set; }

但正如我之前所说,最好避免使用该属性,并在需要时使用 fluent API 配置关系。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。