4

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

(这个 BD 似乎是由一个 DB 天才建造的,你会看到……脏活,我知道,但我必须这样做)

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

4

2 回答 2

3

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

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

于 2012-08-07T07:35:55.117 回答
2

这是一个解决方法。(如果我有权将此作为评论发布,我不会将其发布为答案。)您可以使用 EF 查询并在 Where 中加入这两个实体,而不是直接使用关联。

于 2012-08-07T08:31:04.493 回答