2010-12-27 17 views
0

Unter dem folgenden Objektmodell zu verwenden:Ist es möglich, einen NHibernate Typdiskriminator als Teil eines Fremdschlüssels

public abstract class Entity 
{ 
    public Guid Id { get; set; } 
} 

public class Category : Entity 
{ 
    public string Name { get; set; } 

    public ICollection<LocalizedProperty> LocalizedProperties { get; set; } 
} 

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

    public ICollection<LocalizedProperty> LocalizedProperties { get; set; } 
} 

public class LocalizedProperty : Entity 
{ 
    public string CultureName { get; set; } 
    public string PropertyName { get; set; } 
    public string PropertyValue { get; set; } 
} 

Ist es möglich, zusammen mit der Unternehmens-ID als Fremdschlüssel einen Typdiskriminator zu verwenden. Die Idee ist, dass die resultierende LocalizedProperties Tabelle würde:

LocalizedProperties 
------------------- 
Id 
EntityType 
EntityId 
CultureName 
PropertyName 
PropertyValue 

Ich weiß, das ist möglich, bei 'Tabelle pro Unterklasse-Mapping, wo jeder meiner „Lokalisieren“ Entitäten von einer Basis lokalisierte Entitätsklasse erben, was wiederum die Verknüpfung mit LocalizedProperty. Ich möchte diese zusätzliche Vererbungsebene jedoch lieber nicht haben, wenn das obige möglich ist.

Danke, Ben

UPDATE

Dank Diego für die Lösung, die Conform verwenden. Für die von Ihnen traditionelle Mapping-Dateien verwenden, habe ich das Beispiel von http://fabiomaulo.blogspot.com/2010/11/conform-any-to-many.html

<?xml version="1.0" encoding="utf-8"?> 
<hibernate-mapping xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" namespace="ConfOrm.UsageExamples.CreateXmlMappingsInBinFolder" assembly="ConfOrm.UsageExamples" xmlns="urn:nhibernate-mapping-2.2"> 
    <class name="Blog"> 
    <id name="Id" type="Guid"> 
     <generator class="guid.comb" /> 
    </id> 
    <property name="Title" /> 
    <property name="Subtitle" /> 
    <set name="Tags" cascade="all" where="TagedItemClass = 'ConfOrm.UsageExamples.CreateXmlMappingsInBinFolder.Blog'"> 
     <key column="TagedItemId" foreign-key="none" /> 
     <one-to-many class="Tag" /> 
    </set> 
    </class> 
</hibernate-mapping> 

<?xml version="1.0" encoding="utf-8"?> 
<hibernate-mapping xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" namespace="ConfOrm.UsageExamples.CreateXmlMappingsInBinFolder" assembly="ConfOrm.UsageExamples" xmlns="urn:nhibernate-mapping-2.2"> 
    <class name="Tag"> 
    <id name="Id" type="Guid"> 
     <generator class="guid.comb" /> 
    </id> 
    <property name="Name" /> 
    <any id-type="Guid" name="TagedItem"> 
     <column name="TagedItemClass" /> 
     <column name="TagedItemId" /> 
    </any> 
    </class> 
</hibernate-mapping> 

Antwort

1

umgewandelt Sie <any> verwenden können.

http://nhibernate.info/doc/nh/en/index.html#mapping-types-anymapping

Für ein vollständiges Beispiel überprüfen http://fabiomaulo.blogspot.com/2010/11/conform-any-to-many.html. Ich denke, es ist genau das, was du brauchst.

+0

Kannst du mir erklären, wie ich dieses Mapping in meinem Beispiel verwenden würde, wenn ich darum kämpfe, es zu sehen, basierend auf dem Beispiel von nhForge? –

+0

@Ben Überprüfen Sie den neuen Link. –

+0

das sieht perfekt aus. Wissen Sie, ob dies mit herkömmlichen Mapping erreicht werden kann oder ist es spezifisch für conform? –

Verwandte Themen