FluentNhibernate和References

时间:2010-08-16 12:32:12

标签: fluent-nhibernate conventions

我正在尝试更改约定,以便我的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

我无法弄清楚我做错了什么。 任何帮助都会被贬低。

此致

阿尔贝托

2 个答案:

答案 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
    }
}

一切正常。