首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >SQL Server特定类型对OrmLite的支持

SQL Server特定类型对OrmLite的支持
EN

Stack Overflow用户
提问于 2013-02-18 01:56:24
回答 1查看 1.3K关注 0票数 15

我刚刚了解到一个天才类型,它将简化我的许多工作,但看起来我首选的ORM不能识别它。

是否有解决方法可以让ServiceStack OrmLite识别SQL Server中的HierarchyId?有没有关于修改哪些文件的建议以及如何继续的提示?

编辑:

下面是这个问题的一个更好的说明。我有以下类:

代码语言:javascript
复制
public class MyClass
{
    public int Id { get; set; }
    public SqlHierarchyId HierarchyId { get; set; }
}

SqlHierarchyId是一种自定义SQL Server数据类型。OrmLite将为其生成以下类:

有趣的是,我可以在属性上使用[StringLength(255)]属性,它将获得varchar(255)类型:

我手动更改了此处的表,并添加了列数据类型以显示差异。请注意第三列的数据类型:

对于其他数据库管理系统(如it can be converted within C# )来说,使用varchar表示是完全合适的,但是对于SQL Server,最好让它与相应的数据类型相匹配。这将使视图的创建变得更容易(由于hierarchyid数据类型的内置函数)。

我知道EF4不支持该类型(不确定5)。我还浏览了GitHub上的OrmLiteDialectProviderBase.cs文件,可以看到支持的ADO.NET数据类型列表。

我的问题很简单:这是ADO.NET的一个强大限制,还是在OrmLite中可以看到?如果有任何建议,我愿意帮助扩展这一部分。

EN

回答 1

Stack Overflow用户

发布于 2015-02-25 13:12:47

ADO.NET支持hierarchyid类型,可以在here中找到一个示例,该示例显示ADO.NET可以直接从Sql Server中将值作为hierarchyid读取,但您需要将参数作为字符串传递给服务器。

向ORM框架添加对hierarchyid类型方法的支持将打破ORM和RDMS之间的抽象。我假设这就是为什么这些功能没有被添加到实体框架中的原因。

您可以通过在数据库中保留层次结构的字符串表示,并在数据库和C#类中将hierarchyid版本作为计算属性来解决此问题,您将需要从C#映射中排除计算的C#属性。

例如,您的表列将声明为:

代码语言:javascript
复制
[SqlHierarchyId] AS ([hierarchyid]::Parse([HierarchyId])) PERSISTED 

你的类是:

代码语言:javascript
复制
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助手方法,例如:

代码语言:javascript
复制
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);

}

如果我把ORMLite语法搞错了,我道歉。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14924173

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档