2010-08-16 87 views
1

我试图让自己的ID遵循这个简单的规则来改变一个约定:产品代码CustomerCodeOrderCode等等等等
我已经找到了一种简单的方法来做到这一点添加约定:FluentNhibernate和参考

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

现在我已经得到了我想要的东西,但似乎FluentNhibernate拒绝申请与列引用我的主键相同的规则。 EX:我的表客户将有一个名为PK CustomerCode但我的表订购将有一个参考列名为CUSTOMER_ID。 我试过不同的方式重命名列Customer_IdCustomerCode(表订购),但似乎没有任何工作正常。 这似乎工作的唯一解决办法是增加一个惯例是这样的:

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

但现在FluentNhibernate创建其中引用我的主键的两列:CostumerCodeCUSTOMER_ID

我搞不​​清楚我做错了什么。 任何帮助将被折衷。

问候,

阿尔贝托

回答

2

看看在ForeignKeyConvention基类。

ForeignKeyConvention是其他几个约定的合并,为指定域中所有外键的命名方案提供了一种简单的方法。这是特别有用的,因为不是所有的外键都可以以同样的方式访问,这取决于它们在哪里;这个惯例否定了需要了解底层结构的知识。

+0

谢谢詹姆斯, 它的工作。 我已经应用了这两个约定,它按预期工作: PrimaryKeyNameConvention + ForeignKeyConvention Alberto – LeftyX 2010-08-17 09:19:48

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

,一切工作正常。

+0

好听。如果你想要一个单一的约定,没有什么能阻止你在你的CustomForeignKeyConvention类中实现'IIdConvention'而不是自己。 – 2010-08-17 13:19:04