25

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

4

3 回答 3

49

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

Map(x => x.Prop1).Index("idx__Prop1");
于 2009-11-19T08:07:00.800 回答
15

您是指列上的索引吗?

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

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 是一个很好的折衷方案,既不干扰您的域模型,又对正在发生的事情非常有效和清晰。

于 2009-03-03T20:24:02.783 回答
10

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] 属性现在的工作方式相同。

于 2009-05-26T12:52:21.397 回答