使用 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 自动映射:一对多实体,多对多后端?