1
我有一个问题,当使用抽象类时将外键映射到正确的表。这里是我的模型:使用抽象类和流利的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”外键中的“产品”表(正是创作我想要它)但“FK_Order”外键放置在“实体”表中,而不是“OrderEntries”表中。如果我将类“OrderEntry”的抽象属性更改为具体,那么一切都正常。在这种情况下,我是否必须避免抽象类?
感谢您的回复。你的上下文和我的上下文之间唯一的巨大差异可以在你定义的dbset中找到:我只定义了实体dbset,而不是其他的。我会尽快在我恢复工作时添加一些dbset。 – Glopper
好吧,似乎为每个抽象类创建一个dbset就是解决方案。否则,我假设使用“ToTable”的映射将通过继承层次结构,直到他找到具有相应dbset的第一个抽象类。我将你的帖子标记为答案,再次感谢。 – Glopper