将弱关系映射到 ORM
Posted
技术标签:
【中文标题】将弱关系映射到 ORM【英文标题】:Mapping an weak relationship to an ORM 【发布时间】:2012-04-23 12:32:42 【问题描述】:考虑这 3 个表格:
Client
- Id
Product
- Id
Invoice_Row
- Id
- LinkedObjectId
- LinkedObjectType
Invoice_row 是指上面使用 LinkedObjectId 和 LinkedObjectType 字段的表格,例如:
Invoice_row ID = 1
- LinkedObjectId = 1 (meaning product id = 1)
- LinkedObjectType = 'Product'
Invoice_row ID = 2
- LinkedObjectId = 1 (meaning client id = 1)
- LinkedObjectType = 'Client'
如您所见,invoice_row 对另外两个表有一个动态键(意味着它实际上不是键)。它通过首先查看 LinkedObjectType(要引用哪个表),然后是 LinkedObjectId(引用表中的特定 ID)来引用其他两个表。
是的,我知道这很糟糕,但这是我必须使用的遗留数据模型。
有什么方法可以以正常方式(使用 NH 或 EF)以某种方式映射,如下所示:
Client
Invoice_Rows
Product
Invoice_Rows
谢谢!
【问题讨论】:
正常映射是什么意思?你想检索和保存实体?我不相信有任何方法可以保存实体。 我只想检索实体,不关心保存。 【参考方案1】:在 NHibernate 中(使用 Fluentmapping)
class Invoice
public virtual IHasInvoices Owner get; set;
// or
public virtual object Owner get; set;
// in InvoiceMap
ReferencesAny(x => x.Owner)
.EntityIdentifierColumn("LinkedObjectId")
.EntityTypeColumn("LinkedObjectType")
.IdentityType<long>()
.AddMetaValue<Product>("product")
.AddMetaValue<Client>("client");
那么你就可以把它当作简单的关联来使用(除了你只能设置映射的实体)
【讨论】:
以上是关于将弱关系映射到 ORM的主要内容,如果未能解决你的问题,请参考以下文章
Java实现关系型数据库工具类JdbcUtils系列五:ORM对象关系映射