Карта наследования от универсального класса в Linq To SQL - PullRequest
0 голосов
/ 28 февраля 2009

Я пытаюсь сопоставить мою иерархию наследования с БД, используя Linq для SQL: Наследование такое: классы POCO, без каких-либо атрибутов LINQ to SQL:

public interface IStage
{ ... }

public abstract class SimpleStage<T> : IStage where T : Process
{ ... }

public class ConcreteStage : SimpleStage<ConcreteProcess>
{ ... }

Вот отображение:

<Database Name="NNN" xmlns="http://schemas.microsoft.com/linqtosql/mapping/2007">
  <Table Name="dbo.Stage" Member="Stage">
    <Type Name="BusinessLogic.Domain.IStage">
      <Column Name="ID" Member="ID" DbType="Int NOT NULL IDENTITY" IsPrimaryKey="true" IsDbGenerated="true" AutoSync="OnInsert" />
      <Column Name="StageType" Member="StageType" IsDiscriminator="true" />
      <Type Name="BusinessLogic.Domain.SimpleStage" IsInheritanceDefault="true">
        <Type Name="BusinessLogic.Domain.ConcreteStage" IsInheritanceDefault="true" InheritanceCode="1"/>
      </Type>
    </Type>
  </Table>
</Database>

Во время выполнения я получаю сообщение об ошибке: System.InvalidOperationException не было обработано Сообщение = "Проблема сопоставления: не удается найти тип среды выполнения для сопоставления типов" BusinessLogic.Domain.SimpleStage "."

Ни указание SimpleStage, ни SimpleStage в файле отображения не помогают - среда выполнения продолжает выдавать различные типы ошибок.

DC создается так:

StreamReader sr = new StreamReader(@"MappingFile.map");
XmlMappingSource mapping = XmlMappingSource.FromStream(sr.BaseStream);
DataContext dc = new DataContext(@"connection string", mapping);

Если Linq to SQL не поддерживает это, не могли бы вы, пожалуйста, посоветовать другой ORM, который поддерживает. Заранее спасибо,

Привет!

Ксения

Ответы [ 3 ]

1 голос
/ 28 февраля 2009

Я нашел ответ сам, после того как я посмотрел на IL моего общего класса. В IL его имя выглядит как SimpleStage`1 <...>, поэтому проблема с файлом отображения была исправлена, когда я писал

<Type Name="BusinessLogic.Domain.SimpleStage`1" ...
0 голосов
/ 28 февраля 2009

Я думаю, что это из-за универсального типа T в SimpleStage: он не может создать внутреннюю таблицу соответствия для SimpleStage, поскольку T является универсальным.

0 голосов
/ 28 февраля 2009

Вы добавили ссылку на файлы, а также импортируете ссылки с помощью операторов? ИЛИ используя полные имена классов?

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