gpt4 book ai didi

c# - 使用 NHibernate 映射时覆盖列大小写

转载 作者:行者123 更新时间:2023-12-02 21:56:35 29 4
gpt4 key购买 nike

我以为这很容易找到,但我遇到了麻烦。我有一个类继承自一个名为 EntityBase 的类,该类有一个 ID 字段。基类看起来像这样。

//Here is the declaration
public abstract class EntityBase<IdType>

//here is the property
private IdType _id;
public virtual IdType ID
{
get
{
return _id;
}
set
{
_id = value;
}
}

这对大多数实体都适用,但我们有一个实体实际上是从另一个数据库上运行的存储过程构建的,问题与我们的数据库不同,它返回“Id”而不是“ID”我已经尝试了几种方法覆盖它并设置 ID 但我不断收到以下错误

NHibernate.PropertyNotFoundException: 在类中找不到属性 'Id' 的 setter

public class ListingMapping : IAutoMappingOverride<Listing>
{
public void Override(AutoMapping<Listing> mapping)
{
mapping.Map(x => x.ID).Column("Id");
mapping.Id(x => x.ID).Column("Id");
}
}

下面是实体是如何创建的。

public Listing GetListingById(Guid ListingId)
{
IQuery query = GetSession().GetNamedQuery("GetListingById")
.SetParameter("ListingId", ListingId)
.SetResultTransformer(Transformers.AliasToBean<Listing>());

return (query.UniqueResult<Listing>());
}

我知道自动映射正在加载,因为它们适用于我们覆盖方案的其他类型。希望这是足够的信息,有人可以指出我正确的方向。

最佳答案

您的问题与 NHibernate 映射无关。使用命名查询和结果转换器时不涉及映射。

您的问题是 AliasToBeanResultTransformer,它会尝试在您的类中为查询返回的每个别名找到一个属性,并且区分大小写。

您有 4 种解决方案:

  1. 如果您可以修改存储过程,请将其更改为返回正确的大小写。例如:选择 Id 作为 ID

  2. EntityBase 中的 ID 属性重命名为 Id 并将其映射到 ID 列。

  3. 如果这是一个孤立的情况,请放弃对 EntityBase 的继承并添加一个名为 Id 的属性。

  4. 编写您自己的 NHibernate.Transform.IResultTransformer 实现。看看https://github.com/nhibernate/nhibernate-core/blob/master/src/NHibernate/Transform/AliasToBeanResultTransformer.cs

关于c# - 使用 NHibernate 映射时覆盖列大小写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17680819/

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