我正在使用 EF4 构建一个连接到旧数据库(无法修改)的新服务。
(这个 BD 似乎是由一个 DB 天才建造的,你会看到……脏活,我知道,但我必须这样做)
基本上,我有两个表(SegurosPassageiros和LocsPassageiros),它们的键以常规方式与其他表关联。如以下模型所示,它们与 PK/FK 没有物理关联,但它们由非键列“ SegurosPassageiros.CodPassageiro ”和“ LocsPassageiros.CodLocPassageiroInterno ”链接。此外,此关联是一对多的:
LocsPassageiros 1... * SegurosPassageiros
我找到了许多与非键关联相关的答案,但在同一场景中并非非键和不同名称。
表格:
LocsPassageiros
----------------------------------
CodLocPassageiro (PK) | int
Nome | varchar
CodLocPassageiroInterno | int
----------------------------------
----------------------------------
SegurosPassageiros
----------------------------------
CodSeguroPassageiro(PK) | int
CodPassageiro | int
----------------------------------
代码(类“SeguroPassageiro”映射到表“SeguroPassageiros”):
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 对象中获得一个列表,但关联错误:“SegurosPassageiros.CodPassageiro”和“LocsPassageiros.CodLocPassageiro”(而不是“LocsPassageiros.CodLocPassageiro* Interno* ” )。EF 坚持获取错误的关联(在 LocsPassageiros 上获取 PK)。
任何人都知道我怎样才能在 EF 中获得这个关联?