2015-08-25 5 views
1

Моя проблема: при использовании этого расширения он отображает только значение ID из базы данных в объект класса.Карта SQL для класса в Dapper

Так что мне любопытно, как я могу отобразить другие значения?

C# Mapper

public class SoftwareReleaseTypeHandle : SqlMapper.TypeHandler<SoftwareRelease> 
    { 
     public override SoftwareRelease Parse(object value) 
     { 
      if (value == null || value is DBNull) 
      { 
       return null; 
      } 

      SoftwareRelease rel = new SoftwareRelease(); 
      rel.ID = (Guid)value; 

      return rel; 
     } 

     public override void SetValue(IDbDataParameter parameter, SoftwareRelease value) 
     { 
      parameter.DbType = DbType.Guid; 
      parameter.Value = value.ID.ToString(); 
     } 
    } 

таблица SQL выглядит следующим образом:

CREATE TABLE [dbo].[SoftwareRelease](
    [ID] [uniqueidentifier] NOT NULL, 
    [Type] [tinyint] NOT NULL, 
    [ReleaseType] [tinyint] NOT NULL, 
    [Version] [nchar](30) NOT NULL, 
    [ZipFile] [varbinary](max) NOT NULL, 
    [Date] [datetime] NOT NULL 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] 

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

class MyInstallation 
{ 
public string Bla; 
public string BlaBla; 
SoftwareRelease MyInstallation; 
} 

И когда я en используйте Dapper для получения из таблицы, которая выглядит.

CREATE TABLE [dbo].[MyInstallation](
     [ID] [uniqueidentifier] NOT NULL, 
     [Bl] [nchar](30) NOT NULL, 
     [BlaBla] [nchar](30) NOT NULL, 
     [MyInstallation] [uniqueidentifier] NOT NULL, 
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] 

ответ

1

Обработчики типа Dapper предназначены для сопоставления значения одного столбца в базе данных одному члену вашего POCO. Они используются для типов, которые ядро ​​Dapper не понимает - обычно это все, что не является ядром .NET.

Вы не говорите то, что вам нужно сделать, но если вы просто пытаетесь прочитать SoftwareRelease строки из базы данных, то вы можете просто сделать следующее:

myDb.Query<SoftwareRelease>("SELECT * FROM SoftwareRelease"); 

Update

Похоже, что вы действительно хотите multi-mapping. Если у вас есть следующий запрос:

SELECT a.Bla, a.BlaBla, b.* 
FROM MyInstallation a 
INNER JOIN SoftwareRelease b ON a.SoftwareReleaseId = b.ID 

Затем вы можете использовать следующие для заполнения объекта:

myDB.Query<MyInstallation, SoftwareRelease, MyInstallation>(
    sql, 
    (installation, softwareRelease) => { 
     installation.SoftwareRelease = softwareRelease; 
    }); 
+0

Добавлено больше от использования. Но в основном я получаю объект класса SoftwareRelease из GUID Referense в других таблицах. Но когда я добавил это, я, по сути, сломал, что его не удалось получить класс SoftwareRelease – EKS

+0

Обновлен мой ответ, чтобы включить альтернативный способ делать вещи ... –

 Смежные вопросы

  • Нет связанных вопросов^_^