2010-08-16 86 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