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
。
只需删除验证即可再次获得完全有效的解决方案。
这个愚蠢的错误浪费了很多时间。
我正在使用带有代码映射的 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
。
只需删除验证即可再次获得完全有效的解决方案。
这个愚蠢的错误浪费了很多时间。