レガシー DB (変更不可) に接続する EF4 を使用して新しいサービスを構築しています。
(この BD は、ご覧のとおり、DB の天才によって作成されたようです... 汚い仕事、私は知っていますが、私はそれをしなければなりません)
基本的に、2 つのテーブル ( SegurosPassageirosとLocsPassageiros ) があり、それらのキーは通常の方法で他のテーブルに関連付けられています。以下のモデルに示すように、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 で行う方法を知っている人はいますか?