【问题标题】:Fluent NHibernate table naming convention not workingFluent NHibernate 表命名约定不起作用
【发布时间】:2012-11-15 15:46:33
【问题描述】:

我将以下约定加载到我的 FNH 配置中

public class TableNameConvention : IClassConvention, IClassConventionAcceptance
{
    public void Accept(IAcceptanceCriteria<IClassInspector> criteria)
    {
        criteria.Expect(x => x.TableName, Is.Not.Set);
    }

    public void Apply(IClassInstance instance)
    {
        var tableName = instance.EntityType.Name.Pluralise();

        instance.Table(tableName);
    }
}

我没有在我的任何个映射中指定表名,但是这个约定并不适用。我正在使用 Fluent NHibernate 1.4.1.1。谁能发现我可能做错了什么?

更新

约定按以下方式加载:

public static NHibernate.Cfg.Configuration BuildConfiguration()
{
    var connectionStringName = "mydb";
    return Fluently.Configure(new NHibernate.Cfg.Configuration())
        .Database(MsSqlConfiguration
                      .MsSql2008.ConnectionString(c => c.FromConnectionStringWithKey(connectionStringName))
                      .Dialect<MsSql2008Dialect>()
                      .AdoNetBatchSize(50))
        .Mappings(m =>
        {
            m.FluentMappings.AddFromAssemblyOf<Profile>();
            m.FluentMappings.Conventions.Add(DefaultLazy.Always(), DynamicUpdate.AlwaysTrue(), DynamicInsert.AlwaysTrue());
            m.FluentMappings.Conventions.AddFromAssemblyOf<HiLoConvention>();
        })
        .ExposeConfiguration(config => config.SetProperty(NHibernate.Cfg.Environment.CurrentSessionContextClass, typeof(ManagedWebSessionContext).AssemblyQualifiedName))
        .ExposeConfiguration(HiLoConvention.CreateScript)
        .ExposeConfiguration(RunSchemaUpdate)
        .BuildConfiguration();
}

所有约定与上面在 .AddFromAssembly() 方法调用中引用的 HiLoConvention 位于相同的程序集和命名空间中。

更新 2:

问题出在 Accept() 方法中,因为如果我删除了这个方法(以及类声明中的 IClassConventionAcceptance 接口),那么就会应用约定。我也尝试过这种期望无济于事

criteria.Expect(x => string.IsNullOrEmpty(x.TableName))

原始代码适用于 Fluent 1.2.1...

【问题讨论】:

  • 你是如何加载这个约定的?你能分享那个代码吗?
  • @Suhas,当然。我已经更新了问题。

标签: nhibernate fluent-nhibernate conventions


【解决方案1】:

这个问题很老,但也许这可以帮助其他人:

我假设您想为每个实体设置约定,除非在映射中明确指定了表名。因此,要实现这一点,您只需执行以下操作:

public class TableNameConvention : IClassConvention
{
    public void Apply(IClassInstance instance)
    {
        var tableName = instance.EntityType.Name.Pluralise();

        instance.Table(tableName);
    }
}

这将对所有实体应用约定,除非在地图中明确指定了 TableName。

【讨论】:

    【解决方案2】:

    你试过了吗

    m.FluentMappings.ConventionDiscovery.AddFromAssemblyOf<HiLoConvention>()
    

    代替

    m.FluentMappings.Conventions.AddFromAssemblyOf<HiLoConvention>()
    

    【讨论】:

    • ConventionDiscovery 属于哪个程序集?这不适合我。
    • 顺便说一句,约定正在被采纳。我可以调试并看到 Accept() 方法运行。但是 Apply() 没有。
    猜你喜欢
    • 2010-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-07
    • 1970-01-01
    • 2023-03-31
    • 2010-12-09
    相关资源
    最近更新 更多