2016-10-27 8 views
0

2つの独立したエンティティ(ソースとターゲット)と1つのソースを1つのターゲットに結合するオプションのエンティティがあります。関係はソースとターゲットのエンティティの両方のタイプのSourceTargetBindingのナビゲーションプロパティを除いて、次のようになります。エンティティフレームワークコードファースト6.1.3 - マイグレーションが間違った外部キーを作成

enter image description here

をモデル:

public class Source 
{ 
    [Key] 
    public long SourceID { get; set; } 
    public string Name { get; set; } 
    public SourceTargetBinding TargetBinding { get; set; } 
} 

public class Target 
{ 
    [Key] 
    public long TargetID { get; set; } 
    public string Name { get; set; } 
    public SourceTargetBinding SourceBinding { get; set; } 
} 
public class SourceTargetBinding 
{ 
    [Key] 
    public long SourceID { get; set; } 
    public long TargetID { get; set; } 
    public Source Source { get; set; } 
    public Target Target { get; set; } 
} 

コンテキスト:

public class MyContext : DbContext 
{ 
    public MyContext() : base("name=MyContextData") 
    { 
    } 

    public DbSet<Source> Sources { get; set; } 
    public DbSet<Target> Targets { get; set; } 
    public DbSet<SourceTargetBinding> SourceTargetBindings { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<SourceTargetBinding>() 
      .HasKey(b => b.SourceID); 
     modelBuilder.Entity<SourceTargetBinding>() 
      .HasRequired(b => b.Source) 
      .WithOptional(s => s.TargetBinding); 
     modelBuilder.Entity<SourceTargetBinding>() 
      .HasRequired(b => b.Target) 
      .WithOptional(t => t.SourceBinding); 

     base.OnModelCreating(modelBuilder); 
    } 
} 

そしてここに生成された移行があります。私はソース(Source.TargetBinding)とターゲット(Target.SourceBinding)からナビゲーションプロパティを削除する場合は、EFが正しい外部キーを作成します

public override void Up() 
    { 
     CreateTable(
      "dbo.Sources", 
      c => new 
       { 
        SourceID = c.Long(nullable: false, identity: true), 
        Name = c.String(), 
       }) 
      .PrimaryKey(t => t.SourceID); 

     CreateTable(
      "dbo.SourceTargetBindings", 
      c => new 
       { 
        SourceID = c.Long(nullable: false), 
        TargetID = c.Long(nullable: false), 
       }) 
      .PrimaryKey(t => t.SourceID) 
      .ForeignKey("dbo.Sources", t => t.SourceID) 
      .ForeignKey("dbo.Targets", t => t.SourceID) 
      .Index(t => t.SourceID); 

     CreateTable(
      "dbo.Targets", 
      c => new 
       { 
        TargetID = c.Long(nullable: false, identity: true), 
        Name = c.String(), 
       }) 
      .PrimaryKey(t => t.TargetID); 
    } 

:ターゲットへSourceTargetBindingsから間違った外部キーを注意してください。しかし、私はそれらのナビゲーションプロパティが必要です。

私は間違っているとは思わない。 TargetIDはFKの明白な依存列となるようです。従属列を指定するための流暢なAPIセマンティクスがある場合は、それを見つけることができません。 TargetIDは(必要な)モデルのプロパティとして公開されているため、Map()は機能しません。

私はまた、結合エンティティでHasRequired-WithOptionalの代わりにSourceとTargetで逆セマンティクスHasOptional-WithRequiredを試しました。私は同じ誤った結果を得る。

答えて

0

問題は接合テーブルにあります。あなたは、多くのSourceIdsを有することができるので、ソースID +ターゲットIDは一意ので、キーになるので、composite keyを定義する必要があります。

public class SourceTargetBinding 
{ 
    [Key, Column(Order = 0)] 
    public long SourceID { get; set; } 
    [Key, Column(Order = 1)] 
    public long TargetID { get; set; } 
    public Source Source { get; set; } 
    public Target Target { get; set; } 
} 

をそして、あなたの流暢なコードは次のようになります。

modelBuilder.Entity<SourceTargetBinding>().HasKey(e => new { e.SourceId, e.TargetId }); 

EDIT:あなたがしたい場合0 SourceTargetBinding:

public class SourceTargetBinding 
{ 
    [Key, ForeignKey("Source")] 
    public long SourceID { get; set; } 
    public long TargetID { get; set; } 
    public Source Source { get; set; } 
    public Target Target { get; set; } 
} 

EDIT 2:

、それはキーとFKの両方でマークする必要があります
modelBuilder.Entity<SourceTargetBinding>() 
     .HasRequired(b => b.Target) 
     .WithOptional(t => t.SourceBinding) 
     .Map(m => m.MapKey("TargetId")); 
+0

複数のSourceIDを指定することはできません。 SourceとSourceTargetBindingの関係は、1〜0..1です。私はそれをより明示的にするために質問を更新します。 – Pat

+0

更新を参照してください[ここをクリック](http://www.entityframeworktutorial.net/code-first/configure-one-to-one-relationship-in-code-first.aspx) –

+0

EFはすでに慣例によりSourceIDはSourceへの外部キーの従属列です。生成された移行では、 ".ForeignKey(" dbo.Sources "、t => t.SourceID)"を参照してください。これは、EFが間違っているSourceTargetBinding - > Targetの外部キーの依存列です。 – Pat

関連する問題