2011-01-17 8 views
4

Ich schaue auf Umzug nach Fluent NHibernate - das einzige Problem, auf das ich bis jetzt stoße, ist, dass Sie keinen fremden Schlüsselnamen auf einem verbundenen Unterklasse-Mapping angeben können.fließend NHibernate - beigetretene Unterklasse ForeignKey Name

Hat jemand dafür eine Lösung oder einen Workaround?

Ich fand this post, aber der Vorschlag wurde eindeutig nicht zum Code hinzugefügt.

Ich würde gerne vermeiden, den Code selbst anzupassen, wenn möglich.

Jede Hilfe wäre toll ...

Beispiel:

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>(); 
    } 
} 

Dies erzeugt so etwas wie:

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

Beachten Sie, dass kein Fremdschlüssel Namen in der Mapping-hbm angegeben ist Datei - wie in:

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

Antwort

5

Versuchen Sie etwas wie das

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