我想我可能知道最常见的建议是“更改数据库架构”,但不幸的是,这是“我遇到了遗留数据库”的情况之一。
基本上我想使用Fluent NHibernate
来映射以下内容CREATE TABLE Person (PersonId int)
CREATE TABLE Organisation (OrganisationId int)
CREATE TABLE OwnedPhoneNumber (Id int, PersonId int, OrganisationId int,
PhoneNumber varchar(50))
interface IPhoneNumberOwner
{
int Id {get; set;}
}
class Person : IPhoneNumberOwner
{
public virtual int Id {get; set;}
public virtual ISet<OwnedPhoneNumber> PhoneNumbers {get; set;}
}
class Organisation : IPhoneNumberOwner
{
public virtual int Id {get; set;}
public virtual ISet<OwnedPhoneNumber> PhoneNumbers {get; set;}
}
class OwnedPhoneNumber
{
public virtual int Id {get; set;}
public virtual IPhoneNumberOwner Owner {get; set;}
public virtual string PhoneNumber {get; set;}
}
我的问题是如何为OwnedPhoneNumber类创建ClassMap文件以确定在持久化实体时使用的列,即如果它是Person对象使用PersonId列,如果它是组织使用OrganisationId列。从父类映射集合是没有问题的。
希望我已经包含了足够的细节来解释这个问题,但如果没有,那么显然会大喊大叫。
答案 0 :(得分:0)
如果有人遇到同样的问题,请注意这一点,但我找到了一些可能会喜欢的解决方法(有些可能没有)。在得到一些不太有用的答案之后,我得出的结论是(将数据库模式讨论放在一边)这不能用nhibernate来完成。因此,我决定在数据库中创建两个视图,并将这些视图作为表格呈现给映射中的nhibernate。即。
CREATE VIEW dbo.vw_PersonPhoneNumber
AS
SELECT pn.Id,
pn.PersonId,
pn.PhoneNumber
FROM dbo.PhoneNumber pn INNER JOIN dbo.Person o ON pn.PersonId = o.PersonId
和
CREATE VIEW dbo.vw_OrganisationPhoneNumber
AS
SELECT pn.Id,
pn.OrganisationId,
pn.PhoneNumber
FROM dbo.PhoneNumber pn INNER JOIN dbo.Organisation o ON pn.OrganistionId = o.OrganisationId
在映射中使用这些视图就像它们是表一样,在维护原始模式的同时启用所有正常的CRUD操作,尽管有两个额外的视图。
当然,当您无法更改现有数据库的表结构时,我认为这是妥协的。