gpt4 book ai didi

c# - FluentNhibernate 公式映射与连接表中的参数

转载 作者:太空宇宙 更新时间:2023-11-03 13:22:42 27 4
gpt4 key购买 nike

我对 FluentNhibernate 公式映射有疑问。我需要在公式中使用联接表中的一列。

问题在以下三个表中得到证明:City, Person, Address

class Person {
int PersonId { get; set; }

int AddressId { get; set; }

Address PersonAddress { get; set; }

string CityName { get; set; }
}

class Address {
int AddressId { get; set; }

string Street { get; set; }
}

class AddressMap<Address> {
Id(x => x.AddressId, "ADDRESS_ID");

Map(x => x.Street, "STREET");
}


class PersonMap<Person> {
Id(x => x.Id, "PERSON_ID");

References(x => x.PersonAddress).Column("ADDRESS_ID);

Map(x => x.CityName).Formula("select Name from City c where c.street = STREET");
// Doesn't work, STREET is a part of the joined table !
}

知道如何正确编写公式映射吗?当我使用值重写映射时NHibernate 将生成,一切正常,但是,这是非常肮脏的解决方案:

Map(x => x.CityName).Formula("select Name from City c where c.street = address1_.STREET"); 
// Works !!

非常感谢任何帮助!

最佳答案

在 NHibernate 中没有直接的方法来支持另一个加入表的别名。为什么?

because that joined table simply does not have to be part of the join

考虑延迟加载的地址 - 即不是 SELECT 的一部分,或者一些没有地址表的投影。

Formula 旨在作为一种智能或更智能 的方式来访问当前 表中的数据。或者如何创建一些独立的子选择、子查询……并传递当前id,作为引用过滤器。

例如在这里,在 Ayende 的 NHibernate property Mapping ,我们可以看到:

<property name="CountOfPosts"
formula="(select count(*) from Posts where Posts.Id = Id)"/>

像这样生成 SELECT:

SELECT ...
// the injected 'Id' is from current table
(select count(*) from Posts where Posts.Id = this_.Id)
FROM [MainTable] this_ // the alias of current table

建议:City 或城市名称可以只是另一个引用(如果不是直接是地址的字符串属性)。它将使我们能够非常轻松地使用它(选择、投影、过滤、排序),并且我们不会依赖于某些“隐藏的、硬编码的”映射。这将是干净的模型:

Person.Address.City.Name

关于c# - FluentNhibernate 公式映射与连接表中的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23568195/

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