我试图在基类和派生类之间映射垂直继承(显然)。我使用的是仅代码和FluentAPI方法,我发现了几乎ZERO文档。我已经找到了几个关于垂直继承和仅代码的文档,但很少有关于管理鉴别器列/值的文档。
我一直试图通过仅使用代码在blog post和implementing vertical inheritance上的一些文档的组合来推断如何执行此操作。一切都无济于事。
你会看到我有一个“ Deliverables ”基表和“ PrintDeliverables ”。将会有其他衍生品出现在路上。但我想我先从一开始。
无论如何,我自然会有映射到表格的模型。
public class PrintDeliverable : BDeliverableBase
{
public String PaperItemNumber { get; set; }
public String PrinterModel { get; set; }
public Boolean? ColorOption { get; set; }
public String ProductCode { get; set; }
}
public class BDeliverableBase : BModelBase, IDeliverable, ISingleID
{
public Int64 ID { get; set; }
public String Label { get; set; }
public String Description { get; set; }
public IList<DeliverableAttribute> Attributes { get; set; }
public Int64 TypeID { get; set; }
public DeliverableType Type { get; set; }
}
public class DeliverableType : BModelBase, ISingleID
{
public Int64 ID { get; set; }
public String Label { get; set; }
public String Description { get; set; }
public IList<BDeliverableBase> Deliverables { get; set; }
}
我有标准的映射,它映射字段和类型,大小等。当我运行它而没有进一步添加时,我得到错误...
Invalid Column name voa_class
我的研究发现,ORM正在尝试使用一个值来更新“discriminator”列,该值将基表和表与派生数据绑定在一起。我了解到我可以更改它使用的列的名称,这是我在BASE CLASS映射(BDeliverableBase)中所做的。我将其更改为使用“DeliverableTypeId”列,因为DeliverableType指示它是哪个可交付类型。由于每个TYPE都有自己的派生表,因此这将是一个合适的值,用于关联使用哪个派生表。
MappingConfiguration<BDeliverableBase> map = new MappingConfiguration<BDeliverableBase>();
map.HasDiscriminator().ToColumn("DeliverableTypeId");
它似乎更喜欢这个但是它想要将这个疯狂的数字(例如// 612274703-854)插入到DeliverableTypeId列中,当然,它不是DeliverableTypes表的外键。
Insert of '612274703-' failed: Telerik.OpenAccess.RT.sql.SQLException: The INSERT statement conflicted with the FOREIGN KEY constraint "FK_DeliverableType". The conflict occurred in database "DB1", table "dbo.DeliverableTypes", column 'DeliverableTypeId'
我了解到OpenAccess / DataAccess会生成一个哈希值以插入到鉴别器列中。我不想要这个,事实上我知道该值必须是DeliverableType中可用的ID之一。所以我在one of the docs中读到你可以定义分配给鉴别器的值。该示例将硬编码值应用于基类(源自动物的狗和猫)......
animal.HasDiscriminatorValue("23");
这提出了一个问题......我没有 单 值,我可以硬编码。它可能是 DeliverableTypes 表中存在的许多值之一。但是,为了证明这个概念,我硬编码了现有记录的价值
MappingConfiguration<BDeliverableBase> map = new MappingConfiguration<BDeliverableBase>();
map.HasDiscriminator().ToColumn("DeliverableTypeId");
map.HasDiscriminatorValue("819");
我继续从之前得到相同的错误。所以它似乎没有应用我的硬编码值。所以...我想,虽然硬编码这个值有点hacky,但在 派生的 类的映射中定义它会更有意义。这将解决我的硬编码问题,因为该派生类的所有实例都确实具有相同的DeliverableTypeId。所以我试过......
MappingConfiguration<BDeliverableBase> map = new MappingConfiguration<BDeliverableBase>();
map.HasDiscriminator().ToColumn("DeliverableTypeId");
MappingConfiguration<PrintDeliverable> map = new MappingConfiguration<PrintDeliverable>();
map.HasDiscriminatorValue("819");
这导致错误
Insert of '612274703-857' failed: Telerik.OpenAccess.RT.sql.SQLException: String or binary data would be truncated.
所以我得到了一个不同的错误,但仍然是同样的问题。这种类型它试图将ORM生成的鉴别器值(而不是我的819)填充到我假设的是我定义的鉴别器列(DeliverableTypeId),尽管不同的错误让我怀疑它是针对不同的列。(?)
为了不把它拖得太长,我已经尝试了几种组合,这些“HasDiscriminator”和“HasDiscriminatorValue”的分配去了哪里,但总是最终出现这些错误中的一个或另一个。所以问题是......
如何使用仅限代码,使用多个现有“类型”值映射垂直继承?