当列实际存在于数据库中时,ServiceStack OrmLite 返回无效的 ColumnName 错误
ServiceStack OrmLite returing with Invalid ColumnName error when column actually exists in the database
我有一个 class,如下所示:
public class EmployeeHistory
{
public int EmployeeHistoryId { get; set; }
public int TitleId { get; set; }
public int EmployeeId { get; set; }
public bool IsDeleted { get; set; }
public int GeographyId { get; set; }
public Geography Geography { get; set; }
public Title Title { get; set; }
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
}
我正在尝试将其映射到数据库 table,如下所示:
CREATE TABLE [Data].[EmployeeHistory](
[EmployeeHistoryId] [int] IDENTITY(1,1) NOT NULL,
[EmployeeId] [int] NOT NULL,
[GeographyId] [int] NULL,
[TitleId] [int] NULL,
[IsDeleted] [bit] NOT NULL,
[IsActive] AS (case when [EndDate] IS NULL then (1) else (0) end),
[StartDate] [date] NOT NULL,
[EndDate] [date] NULL,
[CreatedDate] [datetime] NOT NULL,
[CreatedBy] [int] NOT NULL,
[ModifiedDate] [datetime] NOT NULL,
[ModifiedBy] [int] NOT NULL
问题总结如下: ORMLite 能够正确序列化 EmployeeId、TitleId、EmployeeHistoryId 但是 它抛出 "Invalid Column Name" 尝试序列化 GeographyId 和 StartDate、EndDate 时出错。
我不确定它能够序列化的字段和它不能序列化的字段之间是否有任何区别。而且我以前从未遇到过 ORMLite 中的序列化问题。不确定这次我错过了什么?
只是添加一些细节: 这也发生在我正在处理的另一个 table 上,即使该列显然存在于 table,它拒绝识别列并抛出 "Invalid column name error"
实际上,这对我来说有点无赖。事实证明,我所指的 table 属于数据库中的特定 Schema,默认情况下 ORMLite 在 DBO 模式中查找内容。然而,这次 Schema 是 DATA 而不是 Dbo,它开始失败,因为在 Dbo schema 中,它没有找到任何名为 EmployeeHistory 的东西。
我发现通过使用 [Schema("SchemaName")] 属性装饰 class 可以轻松解决此问题。
确保您没有忽略 OrmLite 的 ModelDefinition 中的该字段。下面是我写给忽略字段定义的方法的一部分。
ModelDefinition definition = GetModelDefinition(typeof(T));
if (definition == null)
return this;
string fieldName = selector.GetPropertyName();
FieldDefinition field = definition.GetFieldDefinition(fieldName);
if (field != null) {
definition.FieldDefinitions.Remove(field);
definition.IgnoredFieldDefinitions.Add(field);
definition.AfterInit();
}
我有一个 class,如下所示:
public class EmployeeHistory
{
public int EmployeeHistoryId { get; set; }
public int TitleId { get; set; }
public int EmployeeId { get; set; }
public bool IsDeleted { get; set; }
public int GeographyId { get; set; }
public Geography Geography { get; set; }
public Title Title { get; set; }
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
}
我正在尝试将其映射到数据库 table,如下所示:
CREATE TABLE [Data].[EmployeeHistory](
[EmployeeHistoryId] [int] IDENTITY(1,1) NOT NULL,
[EmployeeId] [int] NOT NULL,
[GeographyId] [int] NULL,
[TitleId] [int] NULL,
[IsDeleted] [bit] NOT NULL,
[IsActive] AS (case when [EndDate] IS NULL then (1) else (0) end),
[StartDate] [date] NOT NULL,
[EndDate] [date] NULL,
[CreatedDate] [datetime] NOT NULL,
[CreatedBy] [int] NOT NULL,
[ModifiedDate] [datetime] NOT NULL,
[ModifiedBy] [int] NOT NULL
问题总结如下: ORMLite 能够正确序列化 EmployeeId、TitleId、EmployeeHistoryId 但是 它抛出 "Invalid Column Name" 尝试序列化 GeographyId 和 StartDate、EndDate 时出错。 我不确定它能够序列化的字段和它不能序列化的字段之间是否有任何区别。而且我以前从未遇到过 ORMLite 中的序列化问题。不确定这次我错过了什么?
只是添加一些细节: 这也发生在我正在处理的另一个 table 上,即使该列显然存在于 table,它拒绝识别列并抛出 "Invalid column name error"
实际上,这对我来说有点无赖。事实证明,我所指的 table 属于数据库中的特定 Schema,默认情况下 ORMLite 在 DBO 模式中查找内容。然而,这次 Schema 是 DATA 而不是 Dbo,它开始失败,因为在 Dbo schema 中,它没有找到任何名为 EmployeeHistory 的东西。
我发现通过使用 [Schema("SchemaName")] 属性装饰 class 可以轻松解决此问题。
确保您没有忽略 OrmLite 的 ModelDefinition 中的该字段。下面是我写给忽略字段定义的方法的一部分。
ModelDefinition definition = GetModelDefinition(typeof(T));
if (definition == null)
return this;
string fieldName = selector.GetPropertyName();
FieldDefinition field = definition.GetFieldDefinition(fieldName);
if (field != null) {
definition.FieldDefinitions.Remove(field);
definition.IgnoredFieldDefinitions.Add(field);
definition.AfterInit();
}