2つの独立したエンティティ(ソースとターゲット)と1つのソースを1つのターゲットに結合するオプションのエンティティがあります。関係はソースとターゲットのエンティティの両方のタイプのSourceTargetBindingのナビゲーションプロパティを除いて、次のようになります。エンティティフレームワークコードファースト6.1.3 - マイグレーションが間違った外部キーを作成
をモデル:
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を試しました。私は同じ誤った結果を得る。
複数のSourceIDを指定することはできません。 SourceとSourceTargetBindingの関係は、1〜0..1です。私はそれをより明示的にするために質問を更新します。 – Pat
更新を参照してください[ここをクリック](http://www.entityframeworktutorial.net/code-first/configure-one-to-one-relationship-in-code-first.aspx) –
EFはすでに慣例によりSourceIDはSourceへの外部キーの従属列です。生成された移行では、 ".ForeignKey(" dbo.Sources "、t => t.SourceID)"を参照してください。これは、EFが間違っているSourceTargetBinding - > Targetの外部キーの依存列です。 – Pat