次のエンティティは、PersonParameter が抽象クラスであり、Shirt と Shoes が typ(1,2) で継承される最初のコードです。
[Table("Person")]
public class Person
{
[Key]
public int id { get; set; }
public string Name { get; set; }
public int? shirtID { get; set; }
public int? shoesID { get; set; }
[ForeignKey("shirtID")]
public Shirt Shirt { get; set; }
[ForeignKey("shoesID")]
public Shoes Shoes { get; set; }
}
[Table("PersonParameter")]
public abstract class PersonParameter
{
public int id { get; set; }
public string Title { get; set; }
public string Value { get; set; }
public List<Person> Persons { get; set; }
}
public class Shirt : PersonParameter
{
}
public class Shoes : PersonParameter
{
}
およびモデル dbcontext の場合
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<PersonParameter>()
.Map<Shirt>(p => p.Requires("typ").HasValue(1))
.Map<Shoes>(p => p.Requires("typ").HasValue(2));
}
ただし、上記のコードは Person テーブルに不要なフィールド PersonParameter_id を作成します。
public override void Up()
{
CreateTable(
"dbo.PersonParameter",
c => new
{
id = c.Int(nullable: false, identity: true),
Title = c.String(),
Value = c.String(),
typ = c.Int(nullable: false),
})
.PrimaryKey(t => t.id);
CreateTable(
"dbo.Person",
c => new
{
id = c.Int(nullable: false, identity: true),
Name = c.String(),
shirtID = c.Int(),
shoesID = c.Int(),
PersonParameter_id = c.Int(),
})
.PrimaryKey(t => t.id)
.ForeignKey("dbo.PersonParameter", t => t.shirtID)
.ForeignKey("dbo.PersonParameter", t => t.shoesID)
.ForeignKey("dbo.PersonParameter", t => t.PersonParameter_id)
.Index(t => t.shirtID)
.Index(t => t.shoesID)
.Index(t => t.PersonParameter_id);
}
どうすれば解決できますか (PersonParameter_id) HasOptional.WithMany で FluentApi を実行しましたが、解決しませんでした。
EDIT
いくつかのテストの後、非抽象クラスでも追加のIDが作成されることがわかりました。その問題を修正するための1つの解決策は、パラメータークラスからナビゲーションプロパティを削除し、継承クラス(シャツと靴)に追加することです