实体框架4与非键列/字段和不同列/字段名称的关联
本文关键字:字段 关联 实体 框架 | 更新日期: 2024-10-19 20:25:19
我正在使用EF4构建一个新服务,该服务连接到一个遗留数据库(无法修改)。
(正如你所看到的,这个BD似乎是由一个DB天才建造的……我知道,这是一项肮脏的工作,但我必须这样做)
基本上,我有两个表(SegurosPassageiros和LocsPassageiros),它们的键以常规方式与其他表关联。如以下模型所示,它们与PK/FK没有物理关联,但通过非关键列"SegurosPassageiros.CodPassageiros"answers"LocsPassageiros.codLocPassageirosInternet。此外,这种关联是一对多的:
位点Passageiros 1…*SegurosPassageiros
我发现了许多与非密钥关联相关的答案,但在同一场景中,不是非密钥和不同名称都有。
表格:
LocsPassageiros
----------------------------------
CodLocPassageiro (PK) | int
Nome | varchar
CodLocPassageiroInterno | int
----------------------------------
----------------------------------
SegurosPassageiros
----------------------------------
CodSeguroPassageiro(PK) | int
CodPassageiro | int
----------------------------------
代码(类"SeguroPassageiro"映射到表"SegurosPassageiros"):
public class SeguroPassageiro
{
[Key]
public Int32 CodSeguroPassageiro { get; set; }
.... (other fields)
//tried this, no success
//[ForeignKey("Passageiro")]
public virtual Int32 CodLocPassageiroInterno { get; set; }
//tried this annotation with no success
[Association("Passageiro_Seguros", "CodPassageiro", "CodLocPassageiroInterno")]
public virtual Passageiro Passageiro { get; set; }
}
类"Passageiro"映射到表"LocsPassageiros":
public class Passageiro
{
[Key]
public Int32 CodLocPassageiro { get; set; }
... (other fields)
//tried this, no success
//[ForeignKey("Seguros")]
public Int32 CodLocPassageiroInterno { get; set; }
//tried these annotations with no success
[ForeignKey("CodLocPassageiroInterno")]
[Association("Passageiro_Seguros", "CodLocPassageiroInterno", "CodPassageiro")]
public List<SeguroPassageiro> Seguros { get; set; }
}
设置模型:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
modelBuilder.Entity<Dominio.Aereo.Passageiro>().ToTable("LocsPassageiros");
modelBuilder.Entity<Dominio.Aereo.SeguroPassageiro>()
.ToTable("SegurosPassageiros");
//Tried both lines below (together and separeted) with no success:
//modelBuilder.Entity<Dominio.Aereo.SeguroPassageiro>().HasRequired(s => s.Passageiro).WithOptional();
//modelBuilder.Entity<Dominio.Aereo.Passageiro>().HasMany(p => p.Seguros).WithRequired();
//Tried "linking" the column "CodPassageiro" on table "SegurosPassageiros" to
//column "CodLocPassageiroInterno" on table "LocsPassageiros". No success.
modelBuilder.Entity<Dominio.Aereo.SeguroPassageiro>().Property(s => s.CodLocPassageiroInterno).HasColumnName("CodPassageiro");
}
有了这个模型,经过几十次试验,我最接近的方法是在Passageiro对象中获得一个List,但关联错误:"SegurosPassageiros.CodPassageiros"answers"LocsPassageiros.CodLocPassageiro"(而不是"LocsAssageiros.codeLocPassage iros*Internet*")。EF坚持错误的关联(在LocsPassageiros上获得PK)。
有人知道我怎样才能把这个联想写进EF吗?
不幸的是,这是不可能的。EF只能在主体中定义的PK之上建立一对多关系。在您的情况下,仅当LocsPassageiros.CodLocPassageiro
用作主密钥时。
在数据库中,只有当主键是唯一的时,才能建立这样的关系——它必须是主键,或者必须有唯一的约束。如果数据库不满足这些要求,则关系无效。EF目前不支持唯一约束,所以唯一的方法是使用主键。
这是一个变通办法。(如果我有幸将此作为评论发布,我不会将其作为答案发布。)您可以使用EF查询并在Where中联接两个实体,而不是直接使用Association。