【发布时间】: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<Candidato>()- 以下行都是builder.Entity<Idiomaa>()..... 不应该也是builder.Entity<Candidato>()??? -
@Shabuu Seethal 你的课堂缺少 int 关键字
-
你是对的,这是一个复制/粘贴错误。我已经编辑了编码。
-
错误是一样的。列名“Id_Candidato”无效
标签: .net-core entity-framework-core