【问题标题】:FluentNhibernate and ReferencesFluentNhibernate 和参考
【发布时间】:2010-08-16 12:32:11
【问题描述】:

我试图更改约定,以便我的 ID 遵循以下简单规则:ProductCodeCustomerCodeOrderCode 等。
我找到了一种添加约定的简单方法:

public class PrimaryKeyNameConvention : IIdConvention
        {
            public void Apply(FluentNHibernate.Conventions.Instances.IIdentityInstance instance)
            {
                instance.Column(instance.EntityType.Name + "Code");
            }
        } 

现在我得到了我想要的,但似乎 FluentNhibernate 拒绝对引用我的主键的列应用相同的规则。 例如:我的表 Customer 将有一个名为 CustomerCode 的 PK,但我的表 Order 将有一个名为 Customer_Id 的参考列. 我尝试了不同的方法来重命名 CustomerCode 中的列 Customer_Id(表 Order),但似乎没有任何工作正常。 唯一可行的解​​决方案是添加这样的约定:

public class ReferenceConvention : IReferenceConvention
        {
            public void Apply(FluentNHibernate.Conventions.Instances.IManyToOneInstance instance)
            {
                instance.Column(instance.Property.PropertyType.Name + "Code");
            }
        }

但现在 FluentNhibernate 创建了两个引用我的主键的列:CostumerCodeCustomer_Id

我不知道我做错了什么。 任何帮助将不胜感激。

问候,

阿尔伯托

【问题讨论】:

    标签: fluent-nhibernate conventions


    【解决方案1】:

    看看ForeignKeyConvention 基类。

    ForeignKeyConvention 是几个其他约定的合并,它提供了一种简单的方法来指定域中所有外键的命名方案。这特别有用,因为并非所有外键都可以以相同的方式访问,具体取决于它们的位置;这个约定不需要了解底层结构。

    【讨论】:

    • 感谢詹姆斯,它成功了。我已经应用了这两个约定,并且按预期工作:PrimaryKeyNameConvention + ForeignKeyConvention Alberto
    【解决方案2】:

    正如詹姆斯建议的那样,我现在已经应用了这两个约定:

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

    一切正常。

    【讨论】:

    • 很高兴听到。如果您想要一个单一的约定,没有什么可以阻止您在 CustomForeignKeyConvention 类中实现 IIdConvention 而不是自己实现。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-03
    • 1970-01-01
    • 2011-01-24
    相关资源
    最近更新 更多