LinQ XML сопоставление с универсальным типом - PullRequest
1 голос
/ 25 августа 2009

Я пытаюсь использовать внешний XML-файл, чтобы отобразить вывод хранимой процедуры в экземпляр класса. Проблема в том, что мой класс имеет общий тип:

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

Просматривая во многих блогах статьи, которые мне удалось получить:

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

Трюк MyNamespace.MyValue`1 работает отлично, и класс распознается. Я ожидаю четыре строки из хранимой процедуры и получаю четыре экземпляра MyValue , но большая проблема заключается в том, что свойство Value для всех четырех экземпляров равно нулю. Собственность не наносится на карту, и я действительно не понимаю, почему. Возможно, стоит отметить, что свойство Value является универсальным и что когда сопоставление выполняется с использованием атрибутов, оно прекрасно работает.

У кого-нибудь есть подсказка?

Кстати, метод GetResourceCategories:

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

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

Ответы [ 2 ]

0 голосов
/ 24 февраля 2012

Я наткнулся на этот пост, когда занимался исследованием той же проблемы. Так же, как примечание, чтобы закрыть цикл здесь, я обнаружил, что вы можете ссылаться на универсальный тип в исходном XML-файле отображения. В приведенном выше примере один элемент, который вам не хватало, указывал, к какому типу относится параметр с одним типом.

Вы можете просто сказать:

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

Вы должны сказать:

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

В моем сценарии я хотел получить список значений Guid. Поэтому вместо того, чтобы создавать результирующую сущность, которая была специально связана со списком значений Guid, я создал класс SingleValue<T>. Таким образом, в любое время, когда мне нужно было получить список с одним типом значения, я мог. Я просто указываю тип в моем сопоставлении xml.

0 голосов
/ 25 августа 2009

Мне любопытно, почему вы решили использовать этот картографический подход. В большинстве сценариев, которые я видел в Linq2SQL и при использовании шаблона типа репозитория, вы получите общий тип возвращаемого объекта Entity, и вы будете использовать частичные классы для расширения поведения классов Linq2Sql.

Для эффективной работы вы можете использовать шаблон T4 Linq2Sql, который Дамьен Гвард создал здесь , чтобы принудительно реализовать реализацию интерфейса в ваших классах Linq2Sql.

Если вы вынуждены использовать этот подход к реализации, нам нужно увидеть код, который выполняет сопоставление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...