2013-02-17 17 views
15

Ho appena saputo di un tipo geniale che semplificherebbe molto il mio lavoro ma sembra che il mio ORM preferito non lo riconosca.Supporto specifico per SQL Server per OrmLite

Esiste una soluzione alternativa per consentire a ServiceStack OrmLite di riconoscere HierarchyId in SQL Server? Qualche suggerimento su quali file modificare e suggerimenti su come procedere?

EDIT:

Ecco una migliore spiegazione del problema. Ho la seguente classe:

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

SqlHierarchyId è un tipo di dati SQL Server personalizzato. OrmLite genererà la seguente classe per esso:

First MyClass Rendering

Abbastanza divertente, posso utilizzare l'attributo [StringLength(255)] sulla proprietà e otterrà il tipo varchar(255) invece:

Second MyClass Rendering

I manualmente cambiata la tabella qui e aggiunto il tipo di dati della colonna per mostrare la differenza. Prego notare il tipo di dati della terza colonna:

SqlHierarchyId

Avere una rappresentazione varchar è perfettamente bene con altri DBMS come it can be converted within C#, ma con SQL Server è preferibile avere corrisponde al tipo di dati corrispondente. Ciò faciliterà la creazione di viste (grazie alle funzioni integrate del tipo di dati hierarchyid).

So che il tipo non è supportato da EF4 (non sono sicuro di circa 5). Ho anche sfogliato il file OrmLiteDialectProviderBase.cs su GitHub e posso visualizzare un elenco di tipi di dati ADO.NET supportati.

La mia semplice domanda è: questa è una forte limitazione di ADO.NET o questa può essere vista prima o poi in OrmLite? Sono disposto ad aiutare ad estendere questa parte se vengono fatti dei suggerimenti.

+2

Puoi mostrare un esempio di codice SQL + di qualcosa che desideri che OrmLite supporti? – mythz

+1

Non sono sicuro di ciò che fa OrmLite, ma sembra che dovrebbe corrispondere a un tipo di stringa, poiché contiene dati come '/ 123/234/125'. – RedFilter

+0

@mythz: Guarda la domanda modificata –

risposta

1

ADO.NET supporta il tipo gerarchico, un esempio può essere trovato here e mostra che ADO.NET può leggere direttamente i valori dal server Sql come gerarchia di un gerarchia, ma è necessario passare i parametri al server come stringa.

L'aggiunta del supporto per i metodi di tipo gerarchico a un framework ORM interromperà l'astrazione tra l'API ORM e l'RDMS. Suppongo che questo sia il motivo per cui tale funzionalità non è stata aggiunta a Entity Framework.

È possibile aggirare il problema mantenendo una rappresentazione stringa della gerarchia nel database e avendo la versione gerarchico come proprietà calcolata sia nel database che nella classe C#, è necessario escludere la proprietà C# calcolata dal Mappatura ORM.

Per esempio il vostro colonna della tabella sarebbe stata dichiarata come:

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

e la vostra classe come:

public class MyClass { 

    public string HierarchyId { 
     get; 
     set; 
    } 

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

} 

Questa volontà aggiornamenti dallo strato .Net persisteva e consentono di utilizzare i metodi hierarchyid per creare query in SQL Server e lavorare con oggetti materializzati nel livello .Net.

Si dovrà creare query contro la rappresentazione di stringa in voi ORM strato, ma questo potrebbe ancora sfruttare alcuni dei metodi di supporto hierarchyid, ad esempio:

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 se ho avuto la sintassi ORMLite sbagliata.

Problemi correlati