当前位置:  开发笔记 > 编程语言 > 正文

使用Fluent NHibernate生成表索引

如何解决《使用FluentNHibernate生成表索引》经验,为你挑选了3个好方法。

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



1> Paul Batum..:

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

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



2> mookid8000..:

你的意思是列上的索引吗?

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

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

或者你可以使用automapper的属性功能来实现 - 例如:

创建持久性模型后:

{
    var model = new AutoPersistenceModel
    {
        (...)
    }

    model.Conventions.ForAttribute(ApplyIndex);
}


void ApplyIndex(IndexedAttribute attr, IProperty info)
{
    info.SetAttribute("index", "idx__" + info.Property.Name");
}

然后对你的实体这样做:

[Indexed]
public virtual string FirstName { get; set; }

我喜欢后者.在对您的域模型不是非侵入性的情况下,仍然是非常有效且清楚正在发生的事情之间是一个很好的折衷方案.



3> Yann Schwart..:

Mookid的答案非常棒,对我帮助很大,但同时不断发展的Fluent NHibernate API也发生了变化.

那么,现在编写mookid样本的正确方法如下:

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

其中IndexedPropertyConvention如下:

public class IndexedPropertyConvention : AttributePropertyConvention  
{
    protected override void Apply(IndexedAttribute attribute, IProperty target)
    {
         target.SetAttribute("index", "idx__" + target.Property.Name);
    }
}

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

推荐阅读
帆侮听我悄悄说星星
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有