使用 Fluent NHibernate 生成表索引

Posted

技术标签:

【中文标题】使用 Fluent NHibernate 生成表索引【英文标题】:Generate table indexes using Fluent NHibernate 【发布时间】:2010-10-11 02:41:16 【问题描述】:

是否可以使用 Fluent NHibernate 与数据库模式的其余部分一起生成表索引?我希望能够通过自动构建过程生成完整的数据库 DDL。

【问题讨论】:

【参考方案1】:

您是指列上的索引吗?

您可以通过附加 .SetAttribute("index", "nameOfMyIndex") 在您的 ClassMap<...> 文件中手动执行此操作,例如像这样:

Map(c => c.FirstName).SetAttribute("index", "idx__firstname");

或者你可以通过使用自动映射器的属性特性来做到这一点 - 例如。像这样:

创建持久性模型后:


    var model = new AutoPersistenceModel
    
        (...)
    

    model.Conventions.ForAttribute<IndexedAttribute>(ApplyIndex);



void ApplyIndex(IndexedAttribute attr, IProperty info)

    info.SetAttribute("index", "idx__" + info.Property.Name");

然后对您的实体执行此操作:

[Indexed]
public virtual string FirstName  get; set; 

我喜欢后者。 Is 是一个很好的折衷方案,既不会对您的领域模型造成干扰,又能非常有效且清楚地了解正在发生的事情。

【讨论】:

这正是我想要的。谢谢。【参考方案2】:

Mookid 的回答很好,对我帮助很大,但与此同时,不断发展的 Fluent NHibernate API 发生了变化。

所以,现在编写mookid示例的正确方法如下:

//...
model.ConventionDiscovery.Setup(s =>
            
                s.Add<IndexedPropertyConvention>();
                //other conventions to add...
            );

其中 IndexedPropertyConvention 如下:

public class IndexedPropertyConvention : AttributePropertyConvention<IndexedAttribute>  

    protected override void Apply(IndexedAttribute attribute, IProperty target)
    
         target.SetAttribute("index", "idx__" + target.Property.Name);
    

[Indexed] 属性现在的工作方式相同。

【讨论】:

【参考方案3】:

在 Fluent NHibernate 的最新版本中,您可以调用 Index() 方法来执行此操作,而不是使用 SetAttribute(不再存在):

Map(x => x.Prop1).Index("idx__Prop1");

【讨论】:

正确,API 已更改,现在这被认为是设置索引的正确方法。我已经更新了这个问题的答案以反映这一变化。谢谢。

以上是关于使用 Fluent NHibernate 生成表索引的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Fluent 设置 NHibernate.Burrow?

Fluent NHibernate 的类映射生成器

Fluent NHibernate 自动映射:一对多实体,多对多后端?

Fluent Nhibernate 映射多重连接

Fluent NHibernate - HiLo 方案的 PersistenceSpecification

如何使用 Fluent NHibernate 自动映射禁用特定抽象基类的子类化