将弱关系映射到ORM

时间:2012-04-23 12:32:42

标签: entity-framework nhibernate orm

考虑这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 个答案:

答案 0 :(得分:0)

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");

然后您可以将它用作简单关联(除了您只能设置映射实体)