4

レガシー DB (変更不可) に接続する EF4 を使用して新しいサービスを構築しています。

(この BD は、ご覧のとおり、DB の天才によって作成されたようです... 汚い仕事、私は知っていますが、私はそれをしなければなりません)

基本的に、2 つのテーブル ( SegurosPassageirosLocsPassageiros ) があり、それらのキーは通常の方法で他のテーブルに関連付けられています。以下のモデルに示すように、PK/FK との物理的な関連付けはありませんが、非キー列 " SegurosPassageiros.CodPassageiro " および " LocsPassageiros.CodLocPassageiroInterno " によってリンクされています。また、この関連付けは 1 対多です。

LocsPassageiros 1... * SegurosPassageiros

非キーの関連付けに関連する多くの回答を見つけましたが、同じシナリオで非キーと異なる名前の両方ではありません。

テーブル:

 LocsPassageiros 
 ----------------------------------
 CodLocPassageiro (PK)   | int
 Nome                    | varchar
 CodLocPassageiroInterno | int
 ----------------------------------


 ----------------------------------
 SegurosPassageiros
 ----------------------------------
 CodSeguroPassageiro(PK)  | int
 CodPassageiro            | int
 ----------------------------------

コード (テーブル「SegurosPassageiros」にマップされたクラス「SeguroPassageiro」):

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; }
}

テーブル「LocsPassageiros」にマッピングされたクラス「Passageiro」:

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 を取得することでしたが、関連付けが間違っていまし。 )。EF は、間違った関連付けを取得することを主張します (LocsPassageiros で PK を取得します)。

この関連付けを EF で行う方法を知っている人はいますか?

4

2 に答える 2

3

残念ながら、これは不可能です。EFは、プリンシパルエンティティで定義されたPKの上にのみ1対多の関係を構築できます。LocsPassageiros.CodLocPassageiroあなたの場合は、が主キーとして使用される場合のみです。

データベースでは、主キーが一意である場合にのみ、このような関係を構築できます。主キーであるか、一意の制約が必要です。データベースがこれらの要件を満たしていない場合、関係は無効です。EFは現在、一意の制約をサポートしていないため、主キーを使用するのが唯一の方法です。

于 2012-08-07T07:35:55.117 に答える
2

これは回避策です。(これをコメントとして投稿する権限があれば、これを回答として投稿しませんでした。) Association を直接使用する代わりに、EF クエリを使用して、両方のエンティティを Where に結合できます。

于 2012-08-07T08:31:04.493 に答える