gpt4 book ai didi

fluent-nhibernate - Fluent NHibernate 自动映射类约定未应用于整个类层次结构

转载 作者:行者123 更新时间:2023-12-04 18:19:53 27 4
gpt4 key购买 nike

我正在尝试使用 Fluent Nhibernate 自动映射一个简单的继承层次结构,并且我需要为每个表使用与其类稍有不同的名称(下划线而不是 Pascal 大小写)。这似乎是一个使用约定的明显地方。我也想使用 table-per-subclass 策略,但这种组合似乎给我带来了一个问题:该约定仅适用于层次结构的基类。

这是我的自动映射:

AutoMap
.AssemblyOf<BaseRule>()
.IncludeBase<BaseRule>() // "BaseRule" is an abstract class
.Conventions.Add( DefaultCascade.All() )
.Conventions.Add<OracleTableNameConvention>()

我希望我的类如何映射(类名-> 表名):
  abstract class BaseRule -> Base_Rule
class NumberRule : BaseRule -> Number_Rule
class PatternStringRule : BaseRule -> Pattern_String_Rule

我实际得到的是:
  BaseRule -> Base_Rule
NumberRule -> NumberRule
PatternStringRule -> PatternStringRule

如您所见,实际上只更改了基类。这是我现有的约定,以便您可以看到我是如何定义它的:
public class OracleTableNameConvention : IClassConvention
{
public void Apply(IClassInstance instance)
{
string fixedName = instance.EntityType.Name.ToUnderscoredNaming();
instance.Table(fixedName);
}
}

我还查看了 ISubclassConvention接口(interface),并且看不到那里可以调整表的名称(这很有意义,子类并不总是在它们自己的表中)。

如果我删除 IncludeBase从我的自动映射行中,名称变成了我想要的,除了它变成了每个具体类的表。我想使用每个子类的表,将所有公共(public)数据留在一个共享基表中。

我可以为每个名称添加覆盖,如果必须,我会添加,但我宁愿不这样做。

似乎 像这样应该是明显受支持的行为。如何将命名约定应用于层次结构中的每个表,而无需逐个具体类进行表?

最佳答案

当我发布这个问题时,我想通了。
IJoinedSubclassConvention是我需要实现的接口(interface)。

public class OracleSubClassConvention : IJoinedSubclassConvention
{
public void Apply(IJoinedSubclassInstance instance)
{
string fixedName = instance.EntityType.Name.ToUnderscoredNaming();
instance.Table(fixedName);
}
}

我通过寻找任何有方法的东西找到它 Table(string) .

关于fluent-nhibernate - Fluent NHibernate 自动映射类约定未应用于整个类层次结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10888915/

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