抽象クラスを使用しているときに外部キーを正しいテーブルにマッピングする際に問題がありました。抽象クラスと流暢なAPIを使用しているときに、外れた外部キーがあります
public abstract class Entity
{
public Guid UID { get; set; }
}
public abstract class Product : Entity
{
public DeviceModel Model { get; set; }
public User Operator { get; set; }
}
public abstract class OrderEntry : Entity
{
public Order Order { get; set; }
}
public class Device : Product
{
public String Reference { get; set; }
public String Serial { get; set; }
public String SoftwareVersion { get; set; }
}
public class OrderEntryDevice : OrderEntry
{
public DeviceModel Model { get; set; }
}
そして流暢なAPI構成(TPTスキーマ):ここに私のモデルだ
public class EntityConfiguration : EntityTypeConfiguration<Entity>
{
public EntityConfiguration()
{
ToTable("Entities");
HasKey(t => t.UID);
}
}
public class ProductConfiguration : EntityTypeConfiguration<Product>
{
public ProductConfiguration()
{
ToTable("Products");
HasOptional(t => t.Operator)
.WithMany()
.Map(t => t.MapKey("FK_Operator"))
.WillCascadeOnDelete(false);
}
}
public class OrderEntryConfiguration : EntityTypeConfiguration<OrderEntry>
{
public OrderEntryConfiguration()
{
ToTable("OrderEntries");
HasRequired(t => t.Order)
.WithMany()
.Map(t => t.MapKey("FK_Order"))
.WillCascadeOnDelete(false);
}
}
public class DeviceConfiguration : EntityTypeConfiguration<Device>
{
public DeviceConfiguration()
{
ToTable("Devices");
Property(t => t.Reference)
.IsRequired();
Property(t => t.Serial)
.IsRequired();
HasRequired(t => t.Model)
.WithMany()
.Map(t => t.MapKey("FK_Model"))
.WillCascadeOnDelete(false);
}
}
public class OrderEntryDeviceConfiguration : EntityTypeConfiguration<OrderEntryDevice>
{
public OrderEntryDeviceConfiguration()
{
ToTable("OrderEntriesDevice");
HasRequired(t => t.Model)
.WithMany()
.Map(t => t.MapKey("FK_Model"))
.WillCascadeOnDelete(false);
}
}
正確に(「製品」テーブルに「FK_Operator」外部キーを置くデータベースの作成Iそれが必要ですが) "FK_Order"外部キーは、 "OrderEntries"テーブルの代わりに "Entities"テーブルに配置されます。クラス "OrderEntry"の抽象プロパティを具体的に変更すると、すべてがOKです。この場合は抽象クラスintを避けなければならないのですか?
ご返信ありがとうございます。コンテキストと私の大きな違いは、定義したdbsetにあります。エンティティdbsetだけを定義し、他のものは定義しませんでした。私は仕事に戻るとすぐにdbsetを追加しようとします。 – Glopper
OK、それぞれの抽象クラスのためのdbsetの作成が解決策であるようです。そうでなければ、 "ToTable"を使ったマッピングは、対応するdbsetを持つ最初の抽象クラスが見つかるまで、継承階層を通過すると仮定します。私は答えとしてあなたの記事をタグ付けしました、もう一度ありがとうございます。 – Glopper