gpt4 book ai didi

c# - 在运行时根据父类型映射不同的子外键列

转载 作者:太空宇宙 更新时间:2023-11-03 16:54:59 25 4
gpt4 key购买 nike

我想我可能知道最常见的建议是“更改数据库模式”,但不幸的是,这是“我受困于旧数据库”的情况之一。

基本上我想使用 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 列。从父类映射集合是没有问题的。

希望我提供了足够的细节来解释问题,但如果没有,显然要大声喊叫。

最佳答案

请注意这一点,以防万一有人遇到同样的问题,但我发现了一些人可能喜欢(有些人可能不喜欢)的解决方法。在一些不太有用的答案之后,我得出的结论是(撇开数据库模式的讨论)这不能用 nhibernate 来完成。因此,我决定在数据库中创建两个 View ,并将它们显示为表以在映射中休眠。即

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

在映射中使用这些 View ,就好像它们是表一样,可以在保持原始模式的同时启用所有正常的 CRUD 操作,尽管有两个额外的 View 。

当然是一种妥协,但我认为当您无法更改现有数据库的表结构时,这种妥协可能是合理的。

关于c# - 在运行时根据父类型映射不同的子外键列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2454995/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com