Следующие объекты - это мой код, который PersonParameter является абстрактным классом, а рубашка и обувь унаследованы от него с типом (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));
}
но приведенные выше коды создадут нежелательное поле PersonParameter_id в таблице Person:
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) Я сделал несколько FluentApi с HasOptional.WithMany, но не решил.
EDIT
После некоторого теста было обнаружено, что для неабстрактного класса он также создает дополнительный идентификатор, и единственным решением для устранения этой проблемы является удаление свойства навигации из класса параметров и добавление его в классы наследования (рубашка и обувь)