我正在尝试更改约定,以便我的ID遵循以下简单规则: ProductCode , CustomerCode , OrderCode 等等。 /> 我找到了一个简单的方法来添加一个约定:
public class PrimaryKeyNameConvention : IIdConvention
{
public void Apply(FluentNHibernate.Conventions.Instances.IIdentityInstance instance)
{
instance.Column(instance.EntityType.Name + "Code");
}
}
现在我已经得到了我想要的东西,但似乎FluentNhibernate拒绝在引用我的主键的列上应用相同的规则。 EX:我的表客户将有一个名为 CustomerCode 的PK,但我的表订单将有一个名为 Customer_Id 的参考列。 我尝试了不同的方法来重命名 CustomerCode 中的列 Customer_Id (表订单),但似乎无法正常工作。 似乎有效的唯一解决方案是添加这样的约定:
public class ReferenceConvention : IReferenceConvention
{
public void Apply(FluentNHibernate.Conventions.Instances.IManyToOneInstance instance)
{
instance.Column(instance.Property.PropertyType.Name + "Code");
}
}
但现在FluentNhibernate创建了两列引用我的主键: CostumerCode 和 Customer_Id 。
我无法弄清楚我做错了什么。 任何帮助都会被贬低。
此致
阿尔贝托
答案 0 :(得分:2)
查看ForeignKeyConvention基类。
ForeignKeyConvention是其他几个约定的合并,为您域中的所有外键提供了一种简单的方法来指定命名方案。这特别有用,因为并非所有的外键都可以以相同的方式访问,具体取决于它们的位置;这个约定无需了解底层结构。
答案 1 :(得分:0)
正如詹姆斯建议我现在应用这两个惯例:
public class PrimaryKeyNameConvention : IIdConvention
{
public void Apply(FluentNHibernate.Conventions.Instances.IIdentityInstance instance)
{
instance.Column(instance.EntityType.Name + "Code");
}
}
public class CustomForeignKeyConvention : ForeignKeyConvention
{
protected override string GetKeyName(Member property, Type type)
{
if (property == null)
return (type.Name + "Code"); // many-to-many, one-to-many, join
return (property.Name + "Code"); // many-to-one
}
}
一切正常。