2013-02-17 3 views
15

Я только что узнал о типе гения, который упростит мою работу, но похоже, что мой предпочтительный ORM не распознает его.Поддержка типов конкретных SQL-серверов для OrmLite

Есть ли обходное решение, позволяющее ServiceStack OrmLite распознавать HierarchyId в SQL Server? Любые предложения о том, какие файлы нужно изменить и какие намеки на продолжение?

EDIT:

Вот лучшая иллюстрация проблемы. У меня есть следующий класс:

public class MyClass 
{ 
    public int Id { get; set; } 
    public SqlHierarchyId HierarchyId { get; set; } 
} 

SqlHierarchyId является типом данных сервера SQL на заказ. OrmLite будет генерировать следующий класс для него:

First MyClass Rendering

Смешные достаточно, я могу использовать атрибут [StringLength(255)] на имущество и он получит varchar(255) типа вместо:

Second MyClass Rendering

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

SqlHierarchyId

Имея varchar представление прекрасно подходит с другим СУБД, как it can be converted within C#, но с SQL Server является предпочтительным, чтобы он соответствовал соответствующему типу данных. Это упростит создание представлений (из-за встроенных функций типа данных).

Я знаю, что тип не поддерживается EF4 (не уверен около 5). Я также просмотрел файл OrmLiteDialectProviderBase.cs на GitHub, и я вижу список поддерживаемых типов данных ADO.NET.

Мой простой вопрос: Является ли это сильным ограничением ADO.NET, или это можно увидеть когда-нибудь в OrmLite? Я готов помочь продлить эту часть, если будут сделаны какие-либо предложения.

+2

Можете ли вы показать пример кода SQL +, который вы хотели бы поддержать OrmLite? – mythz

+1

Не уверен, что делает OrmLite, но похоже, что он должен соответствовать строковому типу, поскольку он содержит данные типа '/ 123/234/125'. – RedFilter

+0

@mythz: Посмотрите отредактированный вопрос –

ответ

1

ADO.NET поддерживает тип иерархии, пример может быть найден here и показывает, что ADO.NET может считывать значения из Sql Server как иерархии напрямую, но вам необходимо передать параметры на сервер в виде строки.

Добавление поддержки методов типа иерархии в структуру ORM приведет к нарушению абстракции между ORM API и RDMS. Я бы предположил, что это причина, по которой такая функциональность не была добавлена ​​в Entity Framework.

Вы можете обойти проблему, сохранив строковое представление иерархии в своей базе данных и имея версию иерархии как вычисленное свойство как в вашей базе данных, так и в вашем классе C#, вам нужно будет исключить вычисленное свойство C# из Отображение ORM.

Например ваш столбец таблицы будет объявлен как:

[SqlHierarchyId] AS ([hierarchyid]::Parse([HierarchyId])) PERSISTED 

и ваш класс, как:

public class MyClass { 

    public string HierarchyId { 
     get; 
     set; 
    } 

    [Ignore] 
    public SqlHierarchyId SqlHierarchyId { 
     get { 
      return SqlHierarchyId.Parse(new SqlString(HierarchyId)); 
     } 
     set { 
      HierarchyId = value.ToString(); 
     } 
    } 

} 

Это будет сохранялся обновление от слоя .Net и позволяет использовать методы hierarchyid` в для создания запросов в SQL Server и работы с материализованными объектами в .NET-слое.

Вы должны построить запросы к строковому представлению в вас ORM слоя, но это все еще может использовать некоторые из вспомогательных методов hierarchyid` в, например:

public IEnumerable<MyClass> GetDescendants(MyClass node) { 

    string currentLocation = node.HierarchyId; 
    string followingSibling 
     = node.SqlHierarchyId.GetAncestor(1) 
       .GetDescendant(node.SqlHierarchyId, SqlHierarchyId.Null) 
       .ToString(); 

    return db.Select<MyClass>(n => n.HierarchyId > currentLocation 
           && n.HierarchyId < followingSibling); 

} 

Aplogies, если я получил ORMLite синтаксиса неправильно.