2011-01-17 2 views
4

Fluent NHibernate로 이동하는 것을보고 있습니다 - 지금까지 만난 유일한 문제는 합류 된 하위 클래스 매핑에 외래 키 이름을 지정할 수 없다는 것입니다.Fluent NHibernate - joined subclass ForeignKey 이름

누구에게도 해결책이 있습니까?

나는 this post을 발견했으나 제안 사항은 분명히 코드에 추가되지 않았습니다.

가능한 경우 코드를 직접 사용자 정의하지 않는 것이 좋습니다.

어떤 도움이 좋을 것 ...

예 :

public class Product 
{ 
    public string Name { get; set; } 
} 

public class Hammer : Product 
{ 
    public string Description { get; set; } 
} 

public class ProductMap : ClassMap<Product, long> 
{ 
    public ProductMap() 
    { 
     Polymorphism.Implicit(); 
     Map(x => x.Name); 
    } 
} 

public class HammerMap : SubclassMap<Hammer> 
{ 
    public HammerMap() 
    { 
     Extends<Product>(); 
    } 
} 

이 생성 뭔가 같은 : 매핑 HBM에 지정된 외래 키 이름이 없다는 것을

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-access="field.camelcase-underscore" auto-import="false" default-cascade="none" default-lazy="true"> 
    <class xmlns="urn:nhibernate-mapping-2.2" dynamic-insert="true" dynamic-update="true" mutable="true" polymorphism="implicit" optimistic-lock="version" name="Domain.Product, Domain" table="Product"> 
    <id name="Id" type="System.Int64"> 
     <column name="Id" /> 
     <generator class="native"> 
     <param name="sequence">ProductId</param> 
     </generator> 
    </id> 
    <property name="Name" type="System.String"> 
     <column name="Name" /> 
    </property> 
    <joined-subclass name="Domain.Hammer, Domain" table="Hammer"> 
     <key> 
     <column name="Product_Id" /> 
     </key> 
     <property name="Description" type="System.String"> 
      <column name="Description" /> 
     </property> 
    </joined-subclass> 
    </class> 
</hibernate-mapping> 

주 파일 - 같이 :

<joined-subclass name="Domain.Hammer, Domain" table="Hammer"> 
    <key column="Product_Id" foreign-key="FK_Hammer_Product"/> 
</joined-subclass> 

답변

5

다음과 같은 코드를 시도하십시오

public class JoinedSubclassForeignKeyConvention : IJoinedSubclassConvention 
{ 
    public void Apply(IJoinedSubclassInstance instance) 
    { 
     instance.Key.ForeignKey(string.Format("FK_{0}_{1}", 
        instance.EntityType.Name, instance.Type.Name)); 
    } 
}