我有这些表格:
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实现这一目标?
答案 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>());