FluentNHibernate和自定义TableNameConvention

时间:2012-06-18 14:47:32

标签: fluent-nhibernate

FluentNHibernate版本1.3.0.727

我有以下自定义TableNameConvention:

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

    public void Apply(IClassInstance instance)
    {
        instance.Table(instance.EntityType.Name + "s");
    }
}

我有以下实体映射:

public class UserMap : ClassMap<User>
{
    public UserMap()
    {
        Id(x => x.Id).GeneratedBy.Identity();
        Map(x => x.Email).Not.Nullable().Length(200);
        Map(x => x.FirstName).Length(100);
        Map(x => x.LastName).Length(100);
        Map(x => x.Password).Not.Nullable().Length(30);
    }
}

我正在生成这样的数据库:

var configuration = Fluently.Configure()
    .Mappings(m => m.FluentMappings
        .AddFromAssemblyOf<IEntity>()
                              .Conventions.Add<TableNameConvention>())
        .BuildConfiguration();

var schema = new SchemaExport(configuration);
schema.Drop(false, true);
schema.Create(false, true);

然后生成数据库用户实体表仍然按用户生成,但不是我想要的用户。接缝方法失败的接缝。这是FluentNHibernate的错误吗?

1 个答案:

答案 0 :(得分:1)

删除此代码

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

因为它不需要,甚至可能不是你想要的。 FNH在每个属性内部有三个值(例如tablename)

  1. 在classmap中明确设置的值
  2. 按惯例设定的值
  3. 默认值
  4. 并使用它按此顺序valueInEffect = explicitValue ?? conventionValue ?? defaultValue

    找到的内容