在Fluent NHibernate上创建AskedBy_PersonId外来列名(而不是默认的AskedBy_id)

时间:2012-08-21 13:06:57

标签: nhibernate fluent-nhibernate mapping

我有这些表格:

create table Person
(
PersonId int identity(1,1) primary key,
PersonName nvarchar(100) not null
);

create table Question
(
QuestionId int identity(1,1) primary key,
QuestionText nvarchar(100) not null,
AskedBy_PersonId int not null references Person(PersonId),
QuestionModifiedBy_PersonId int not null references Person(PersonId)
);

我有这些模特:

public class Question
{
    public virtual int QuestionId { get; set; }

    public virtual string QuestionText { get; set; }

    public virtual Person AskedBy { get; set; }
    public virtual Person QuestionModifiedBy { get; set; }
}

public class Person
{
    public virtual int PersonId { get; set; }
    public virtual string PersonName { get; set; }
}

我正在使用FluentNHibernate自动化,引用属性默认为这些数据库列名:

AskedBy_id
QuestionModifiedBy_id

如何使FluentNHibernate使引用属性映射到此样式的外部列名?

AskedBy_PersonId
QuestionModifiedBy_PersonId

截至目前,我正在手动覆盖:

.Override<Question>(x => 
{
    x.References(y => y.AskedBy).Column("AskedBy_PersonId");
    x.References(y => y.QuestionModifiedBy).Column("QuestionModifiedBy_PersonId");
})

我想删除覆盖,并希望Fluent NHibernate自动使外部列名遵循上面的命名模式

如何使用Fluent NHibernate实现这一目标?

1 个答案:

答案 0 :(得分:1)

IReferenceConvention实施应该很容易:

public class ReferenceConvention : IReferenceConvention
{
    public void Apply(IManyToOneInstance instance)
    {
        instance.Column(
            instance.Name + "_" + instance.Property.PropertyType.Name + "Id");
    }
}

应该将NHibernate配置为读取约定(使用类似的东西):

Fluently.Configure()
    //... other configuration
    .Mappings(m => m.AutoMappings.Add(
        AutoMap.AssemblyOf<Person>()
            .Conventions.AddFromAssemblyOf<ReferenceConvention>());