【问题标题】:Entity Framework Core many-to-many relation - getting error "Invalid column name 'id'"Entity Framework Core 多对多关系 - 出现错误“列名 'id' 无效”
【发布时间】:2020-05-11 01:16:08
【问题描述】:

我在 Entity Framework Core 的同一个关系表中做三重多对多关系。

证书、语言和候选实体在CandidateLanguageCertificationLanguage关系表中以多对多的方式相互关联。

数据库表是:

CREATE TABLE candidato.Candidato
(
        ID_CANDIDATO  int ,
        NOMBRE  VARCHAR(50) ,
        PRIMARY KEY(ID_CANDIDATO)
);

CREATE TABLE candidato.Idiomaa
(
        ID_IDIOMA  int ,
        NOMBRE  VARCHAR(50) ,
        PRIMARY KEY(ID_IDIOMA)
);

CREATE TABLE candidato.CertificadoIdiomaa
(
        ID_CERTIFICADO_IDIOMA  int,
        NOMBRE  VARCHAR(50),
        PRIMARY KEY(ID_CERTIFICADO_IDIOMA)
);

CREATE TABLE candidato.CandidatoIdiomaCertificacionIdiomaa
(
        ID_CANDIDATO  int,
        ID_IDIOMA  int,
        ID_CERTIFICADO_IDIOMA  int, 
        PRIMARY KEY(ID_CANDIDATO, ID_IDIOMA, ID_CERTIFICADO_IDIOMA),
        FOREIGN KEY (ID_CANDIDATO) REFERENCES candidato.Candidato (id_candidato),
        FOREIGN KEY (ID_IDIOMA) REFERENCES candidato.Idiomaa (ID_IDIOMA),
        FOREIGN KEY (ID_CERTIFICADO_IDIOMA) REFERENCES candidato.CertificadoIdiomaa (ID_CERTIFICADO_IDIOMA) 
);

通过 Fluent API 在上下文中建立的关系是:

builder.Entity<CandidatoIdiomaCertificacionIdiomaa>().ToTable("CandidatoIdiomaCertificacionIdiomaa", "candidato");
builder.Entity<CandidatoIdiomaCertificacionIdiomaa>().HasKey(cici => new { cici.IdCandidato, cici.IdIdioma, cici.IdCertificadoIdioma });
builder.Entity<CandidatoIdiomaCertificacionIdiomaa>().Property(cici => cici.IdCandidato).HasColumnName("Id_Candidato");
builder.Entity<CandidatoIdiomaCertificacionIdiomaa>().Property(cici => cici.IdIdioma).HasColumnName("Id_Idioma");
builder.Entity<CandidatoIdiomaCertificacionIdiomaa>().Property(cici => cici.IdCertificadoIdioma).HasColumnName("Id_Certificado_Idioma");

builder.Entity<CertificadoIdiomaa>().ToTable("CertificadoIdiomaa", "candidato");
builder.Entity<CertificadoIdiomaa>().HasKey(ci => ci.Id);
builder.Entity<CertificadoIdiomaa>().Property(ci => ci.Id).HasColumnName("Id_Certificado_Idioma").ValueGeneratedOnAdd();
builder.Entity<CertificadoIdiomaa>().Property(ci => ci.Nombre).HasColumnName("Nombre");

builder.Entity<Idiomaa>().ToTable("Idiomaa", "candidato");
builder.Entity<Idiomaa>().HasKey(i => i.Id);
builder.Entity<Idiomaa>().Property(i => i.Id).HasColumnName("Id_Candidato").ValueGeneratedOnAdd();
builder.Entity<Idiomaa>().Property(i => i.Nombre).HasColumnName("Nombre");

builder.Entity<Candidato>().ToTable("Candidato", "candidato");
builder.Entity<Candidato>().HasKey(i => i.Id);
builder.Entity<Candidato>().Property(i => i.Id).HasColumnName("Id_Candidato").ValueGeneratedOnAdd();
builder.Entity<Candidato>().Property(i => i.Nombre).HasColumnName("Nombre");

builder.Entity<CandidatoIdiomaCertificacionIdiomaa>()
       .HasOne(cici => cici.CertificadoIdioma)
       .WithMany(cei => cei.CandidatosIdiomasCertificacionesIdiomaas)
       .HasForeignKey(cf => cf.IdCertificadoIdioma);
builder.Entity<CandidatoIdiomaCertificacionIdiomaa>()
       .HasOne(cici => cici.Candidato)
       .WithMany(c => c.CandidatosIdiomasCertificacionesIdiomaas)
       .HasForeignKey(cici => cici.IdCandidato);
builder.Entity<CandidatoIdiomaCertificacionIdiomaa>()
       .HasOne(cici => cici.Idioma)
       .WithMany(cei => cei.CandidatosIdiomasCertificacionesIdiomaas)
       .HasForeignKey(cf => cf.IdIdioma);

模型是:

public class Idiomaa
{
        #region propiedades
        public int Id { get; internal set; }
        public string Nombre { get; internal set; }
        //public ICollection<CandidatoIdiomaa> CandidatosIdiomas { get; internal set; }
        public ICollection<CandidatoIdiomaCertificacionIdiomaa> CandidatosIdiomasCertificacionesIdiomaas { get; internal set; }
        #endregion
}

public class CertificadoIdiomaa
{
            public int Id{ get; internal set; }
            public string Nombre { get; internal set; }
            public ICollection<CandidatoIdiomaCertificacionIdiomaa> CandidatosIdiomasCertificacionesIdiomaas { get; internal set; }
}

public class CandidatoIdiomaCertificacionIdiomaa
{
        #region propiedades
        public int IdCandidato { get; internal set; }
        public int IdIdioma { get; internal set; }
        public int IdCertificadoIdioma { get; internal set; }
        public CertificadoIdiomaa CertificadoIdioma { get; internal set; }
        public Candidato Candidato { get; internal set; }
        public Idiomaa Idioma { get; internal set; }
        #endregion
}

public class Candidato 
{
        #region propiedades
        public int Id { get; internal set; }
        public string CorreoElectronico { get; internal set; }
        #endregion
}

我写的查询是:

contexto.Where(certificadoIdioma => certificadoIdioma.Nombre.Contains(filtro))
        .Include(ci => ci.CandidatosIdiomasCertificacionesIdiomaas)
        .ThenInclude(cici => cici.Idioma).ToList();

我得到的错误:

列名“Id_Candidato”无效
列名“Id_Candidato”无效

有趣的是,如果我将查询的包含更改为候选,它会完美运行:

contexto.Where(certificadoIdioma => certificadoIdioma.Nombre.Contains(filtro))
        .Include(ci => ci.CandidatosIdiomasCertificacionesIdiomaas)
        .ThenInclude(cici => cici.candidato).ToList();

这些表是由 DBA 创建的,我是一名程序员,我不能修改数据库,我知道你可以在多个表中而不是一个表中创建关系,你的理由是,那是另一回事。我确信在 Entity Framework Core 中可以做到这一点,但我不知道怎么做,我怀疑我在 Fluent API 中设置关系时犯了一个错误,但我已经审查了几个小时,什么也没...

有人可以看看吗?

非常感谢你们。

问候

【问题讨论】:

  • 只是一个错字?当您开始设置builder.Entity&lt;Candidato&gt;() - 以下行都是builder.Entity&lt;Idiomaa&gt;()..... 不应该也是builder.Entity&lt;Candidato&gt;() ???
  • @Shabuu Seethal 你的课堂缺少 int 关键字
  • 你是对的,这是一个复制/粘贴错误。我已经编辑了编码。
  • 错误是一样的。列名“Id_Candidato”无效

标签: .net-core entity-framework-core


【解决方案1】:

您缺少 int 关键字:

public class Idiomaa
{
        #region propiedades
        public Id { get; internal set; }    here int keyword is missing
        public string Nombre { get; internal set; }
        //public ICollection<CandidatoIdiomaa> CandidatosIdiomas { get; internal set; }
        public ICollection<CandidatoIdiomaCertificacionIdiomaa> CandidatosIdiomasCertificacionesIdiomaas { get; internal set; }
        #endregion
}
public Id { get; internal set; }    here int keyword is missing

【讨论】:

  • 你是对的,这是一个复制/粘贴错误。我已经编辑了编码。
  • 错误是一样的。"Invalid column name 'Id_Candidato"
  • @Shabuu Seethal 在您的模型类上尝试 [key] 数据注释
  • 我只能使用fluent api,我的项目中禁止使用数据符号
猜你喜欢
  • 2020-12-09
  • 2018-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-10
  • 1970-01-01
  • 2016-12-18
  • 2021-04-09
相关资源
最近更新 更多