Domanda

Io sono il mapping di un database legacy con nhibernate e avendo alcuni problemi con la mappatura di una relazione.

Le due classi di simile a questo

public class Questionnaire
{
    public int Id {get; set;}
    public string FormCode {get; set;}
    public IList<Question> Questions {get; set;}
}

public class Question
{
    public int Id{get; set;}
    public Questionnaire Questionnaire {get;set;}
    public string QuestionText{get;set;}
}

le tabelle che sono come questo

Questionnaire Table  
Id int  
FormCode varchar(100)  

Question Table  
Id int  
FormCode varchar(100)  
QuestionText varchar(max)  

La relazione tra le due tabelle di essere il formcode colonna.

Il mio attuale mappatura è come questo

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="QDesign.Core.Models" assembly="QDesign.Core">
<class name="Questionnaire" table="_questionnaire_list">
    <id column="Id" name="Id">
            <generator class="identity"/>
    </id>
        <property name="FormCode" column="FormCode"/>
        <bag name="Questions" >
            <key foreign-key="FormCode" property-ref="FormCode" />
            <one-to-many class="Question" />            
        </bag>
</class>
</hibernate-mapping>

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="QDesign.Core.Models" assembly="QDesign.Core">
<class name="Question" table="_questionnaire_items">
    <id column="ID" name="Id" unsaved-value="-1">
            <generator class="identity" />
        </id>
        <property name="QuestionText" column="QuestionText" />
</class>
</hibernate-mapping>

Quando ho eseguito il mapping ho un Identificatore di tipo non corrispondente supponendo che si sta cercando di mettere il formcode in l'Id della domanda.Purtroppo non sono in grado di modificare la struttura della tabella e io sono in perdita per come la mappa di questo e di qualsiasi aiuto sarebbe molto apprezzato.

È stato utile?

Soluzione

La vostra relazione è una relazione m:n senza una entità intermedia.E ' un classico errore di definire m:n relazioni in questo modo, perché taglia fuori un pk lato, che porta alla situazione in cui ci sono due tavoli con lo stesso attributo/campo e capita di semanticamente rappresentano la stessa cosa.Tuttavia, perché sono non-pk valori in entrambi i lati, non c'è ridondanza e anche eventuali inesattezze.È possibile unire le due tabelle sopra i due campi, ma semanticamente non significa nulla:per un modello di entità di relazionarsi entità X, Y, FK prende il PK lato della relazione come FK campi, e per m:n relazioni, avete bisogno di due m:1 rapporti provenienti dall'organismo intermedio.Che si, c'è non fa eccezione.

Quindi, anche se si desidera mappare questo il modo in cui si propongono, non può essere fatto come o/r mapper non può garantire la correttezza, perché l'ha suggerito rapporto, semplicemente, non è corretto.

Altri suggerimenti

Beh, questo è il "problema" con Orm.Dico "problema", perché la Sospensione è tecnicamente corretto:le chiavi esterne devono essere le chiavi primarie.Ma, come si sta assistendo, che non è sempre il caso.

ID è effettivamente utilizzato per qualsiasi cosa?Se non, il percorso di minor resistenza è quello di rendere FormCode la chiave primaria.È che un'opzione?

Se non, io non sono davvero sicuro di cosa fare di diverso query domande anziché considerarli come entità figlio.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top