实体框架4与非键列/字段和不同列/字段名称的关联

本文关键字:字段 关联 实体 框架 | 更新日期: 2024-10-19 20:25:19

我正在使用EF4构建一个新服务,该服务连接到一个遗留数据库(无法修改)。

(正如你所看到的,这个BD似乎是由一个DB天才建造的……我知道,这是一项肮脏的工作,但我必须这样做)

基本上,我有两个表(SegurosPassageirosLocsPassageiros),它们的键以常规方式与其他表关联。如以下模型所示,它们与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吗?

实体框架4与非键列/字段和不同列/字段名称的关联

不幸的是,这是不可能的。EF只能在主体中定义的PK之上建立一对多关系。在您的情况下,仅当LocsPassageiros.CodLocPassageiro用作主密钥时。

在数据库中,只有当主键是唯一的时,才能建立这样的关系——它必须是主键,或者必须有唯一的约束。如果数据库不满足这些要求,则关系无效。EF目前不支持唯一约束,所以唯一的方法是使用主键。

这是一个变通办法。(如果我有幸将此作为评论发布,我不会将其作为答案发布。)您可以使用EF查询并在Where中联接两个实体,而不是直接使用Association。