NHibernate hierarchyid SQL 服务器 2014

NHibernate hierarchyid SQL Server 2014

我正在使用带有代码映射的 NHibernate,连接了 SQL 服务器。此服务器还包含文件 tables.

我为其开发的客户有一个 SQL Server 2012,我也使用了很长时间。由于 VM 运行ning 我的本地服务器最近出现错误,我目前正在尝试 运行 我的代码针对本地主机上的数据库,即 SQL Server 2014。

我收到了来自客户数据库的备份并将其恢复到我的本地服务器。

在一切顺利之前,我的代码运行没有任何大问题。但是当我现在尝试连接到我的本地数据库时,NHibernate 抛出异常:

Wrong column type in sql_pig_pool.dbo.tbl_Abgabebeleg_Dateien for column path_locator. Found: hierarchyid, Expected NVARCHAR(255)

当我将我的连接字符串更改为客户数据库时,一切又恢复正常了。我假设 SQL Server 2012->2014 发生了某些变化,或者我工作站上的某种本地配置有误。

更新:我现在在本地安装了 SQL Server 2012 并在那里恢复了我的数据库。和 2014 一样的错误。所以差异一定与某些本地配置差异有关。

我的class:

public class TblAbgabebelegDateien
{
    public TblAbgabebelegDateien() { stream_id = Guid.NewGuid(); }
    public virtual string path_locator { get; set; }
    public virtual TblAbgabebelegDateien tbl_AbgabebelegDateienVal { get; set; }
    public virtual Guid stream_id { get; set; }
    public virtual byte[] file_stream { get; set; }
    public virtual string name { get; set; }
    public virtual string file_type { get; set; }
    public virtual long? cached_file_size { get; set; }
    public virtual string creation_time { get; set; }
    public virtual string last_write_time { get; set; }
    public virtual string last_access_time { get; set; }
    public virtual bool is_directory { get; set; }
    public virtual bool is_offline { get; set; }
    public virtual bool is_hidden { get; set; }
    public virtual bool is_readonly { get; set; }
    public virtual bool is_archive { get; set; }
    public virtual bool is_system { get; set; }
    public virtual bool is_temporary { get; set; }
}

我的映射:

public class TblAbgabebelegDateienMap : ClassMapping<TblAbgabebelegDateien> {

    public TblAbgabebelegDateienMap() {
        Schema("dbo");
        Table("tbl_Abgabebeleg_Dateien");
        Lazy(true);
        Id(x => x.path_locator, map => map.Generator(Generators.Assigned));
        Property(x => x.stream_id, map => { map.NotNullable(true); map.Unique(true);  });
        Property(x => x.file_stream);
        Property(x => x.name, map => 
        {
            map.NotNullable(true);
            map.Unique(true);
            map.Length(255);
        });
        Property(x => x.file_type, map => map.Length(255));
        Property(x => x.cached_file_size, map => map.Precision(19));
        Property(x => x.creation_time, map => map.NotNullable(true));
        Property(x => x.last_write_time, map => map.NotNullable(true));
        Property(x => x.last_access_time);
        Property(x => x.is_directory, map => map.NotNullable(true));
        Property(x => x.is_offline, map => map.NotNullable(true));
        Property(x => x.is_hidden, map => map.NotNullable(true));
        Property(x => x.is_readonly, map => map.NotNullable(true));
        Property(x => x.is_archive, map => map.NotNullable(true));
        Property(x => x.is_system, map => map.NotNullable(true));
        Property(x => x.is_temporary, map => map.NotNullable(true));
        ManyToOne(x => x.tbl_AbgabebelegDateienVal, map => 
        {
            map.Column("parent_path_locator");
            map.PropertyRef("path_locator");
            map.Cascade(Cascade.None);
        });
    }
}

有谁知道我应该更改什么,以便我可以再次使用那些 table?我什至不需要路径定位器(我通过 stream_id 访问文件),但它是 PK,非常重要。 NHibernate 不喜欢在其映射中缺少 Id 属性。

我只读了那些 table,所以欢迎任何允许我访问文件 table 的配置。

我看过一个GitHub-Project(NHibernate.HierarchyId),但是是为了流畅的映射,不是为了代码映射。我不能简单地在类型映射中使用字符串 "hierarchyid"。我个人尝试构建 IUserType 派生的 class 也惨遭失败。

附录:我的本地数据库中 SQL Server Management Studio 中不再有子文件夹 "Indexes"。它仍然在我的客户数据库上可用(有 3 个索引:path_locator 上的 PK,stream_id 上的 UQ,parent_path_locator + name 上的 UQ)。这有什么关系吗? 更新 在我的 2012 年新实例中,我再次使用了这个 Indexes 文件夹。

这一切都归结为一个关键的区别:

在我的 IDbIntegrationConfigurationProperties 配置中,我没有为原始版本定义 db.SchemaAction,但为当前版本定义了 db.SchemaAction = SchemaAutoAction.Validate

只需删除验证即可再次获得完全有效的解决方案。

这个愚蠢的错误浪费了很多时间。