2009-08-24 12 views
1

Ich versuche, eine externe XML-Datei zu verwenden, um die Ausgabe von einer gespeicherten Prozedur in einer Instanz einer Klasse abzubilden. Das Problem ist, dass meine Klasse eines generischen Typs ist:LinQ XML-Zuordnung zu einem generischen Typ

public class MyValue<T> 
{ 
    public T Value 
    { 
    get; 
    set; 
    } 
} 

Suche durch eine Menge von Blogs eine Artikel, die ich habe es geschafft, dies zu erhalten:

<?xml version="1.0" encoding="utf-8" ?> 
<Database Name="" xmlns="http://schemas.microsoft.com/linqtosql/mapping/2007"> 
    <Table Name="MyValue" Member="MyNamespace.MyValue`1" > 
     <Type Name="MyNamespace.MyValue`1"> 
      <Column Name="Category" Member="Value" DbType="VarChar(100)" /> 
     </Type> 
    </Table> 
    <Function Method="GetResourceCategories" Name="myprefix_GetResourceCategories" > 
     <ElementType Name="MyNamespace.MyValue`1"/> 
    </Function> 
</Database> 

Die MyNamespace.MyValue`1 Trick funktioniert gut, und die Klasse ist anerkannt. Ich erwarte vier Zeilen von der gespeicherten Prozedur, und ich bekomme vier MyValue <Zeichenfolge> Instanzen, aber das große Problem ist, dass die Eigenschaft Wert für alle vier Instanzen null ist. Die Eigenschaft wird nicht zugeordnet und ich verstehe nicht wirklich warum. Vielleicht ist es wert, darauf hinzuweisen, dass die Eigenschaft Value generisch ist und dass, wenn das Mapping mit Attributen durchgeführt wird, es perfekt funktioniert.

Wer hat eine Ahnung?

BTW die Methode GetResourceCategories:

public ISingleResult<MyValue<string>> GetResourceCategories() 
{ 
    IExecuteResult result = this.ExecuteMethodCall(
    this, 
    (MethodInfo)MethodInfo.GetCurrentMethod()); 

    return (ISingleResult<MyValue<string>>)result.ReturnValue; 
} 

Antwort

0

Ich bin neugierig, wie der Grund, warum Sie sich entschieden haben, diese Art der Zuordnung zu verwenden. In den meisten Szenarien, die ich mit Linq2SQL gesehen habe und die ein Repository-Muster verwenden, würde man einen generischen Typ von Entity zurückgeben, und man würde partielle Klassen verwenden, um das Verhalten der Linq2Sql-Klassen zu erweitern.

Damit dies effektiv funktioniert, können Sie die T4 Linq2Sql-Vorlage verwenden, die Damien Guard here erstellt hat, um die Schnittstellenimplementierung für Ihre Linq2Sql-Klassen zu erzwingen.

Wenn Sie in diesen Implementierungsansatz gezwungen werden, dann müssten wir den Code sehen, der das Mapping durchführt.

+0

Hallo Michael, danke für deine Antwort. Angenommen, ich experimentiere nur mit dem Konzept der XML-Zuordnung in Linq zu SQL. Ich nehme an, dass das, was ich versuche, möglich ist, weil es durch Attributzuordnung erreicht werden kann, daher muss es eine Möglichkeit geben, dies durch XML-Mapping zu tun. Der Code, der das Mapping durchführt, ist das XML, das ich gepostet habe, da ich meinen Kontext erstelle und das XML als Mapping-Quelle übergebe. Wie auch immer, wenn der Code, der den Kontext erzeugt und die GetResourceCategories-Methode aufruft (eine Methode des Kontexts, die ich vergessen habe zu erwähnen) hilft, das Problem herauszufinden, würde ich mich freuen, ihn zu veröffentlichen. –

0

Ich stieß auf diese Stelle, als ich für das gleiche Problem forschte. Genau wie ein Hinweis, um die Schleife hier zu schließen, entdeckte ich, dass Sie einen generischen Typ in einer Mapping-XML-Quelldatei referenzieren können. In dem Beispiel, das Sie oben hatten, gab das eine Stück, das Sie fehlten, an, welcher Typ der einzelne Typparameter ist.

Sie können nur sagen:

<Type Name="MyNamespace.MyValue`1"> 

Sie zu sagen haben:

<Type Name="MyNamespace.MyValue`1[[System.String, mscorlib]]"> 

In meinem Szenario ich eine Liste der GUID-Werte gesucht. Anstatt also eine Ergebniseinheit zu erstellen, die spezifisch an eine Liste von Guid-Werten gebunden ist, habe ich eine Klasse SingleValue<T> erstellt. Auf diese Weise konnte ich jedes Mal, wenn ich eine Liste mit einem einzelnen Werttyp abrufen musste. Ich gebe nur den Typ in meinem XML-Mapping an.

Verwandte Themen