У меня есть класс, который выглядит следующим образом:
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; }
}
и я пытаюсь сопоставить его с таблицей DB, которая выглядит следующим образом:
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 правильно, но он выдает ошибку "Недопустимое имя столбца" при попытке сериализации GeographyId и, StartDate, EndDate. Я не уверен, есть ли разница между полями, которые он может сериализовать, и полями, которые он не может сериализовать. А также у меня никогда не было проблемы с сериализации в ORMLite. Не уверен, что я пропущу на этот раз?
Просто добавьте некоторые детали. Это также случилось с другой таблицей, над которой я работаю, и снова, даже несмотря на то, что столбец явно существует в таблице, он отказывается распознавать столбец и выдает ошибку "Недопустимое имя столбца",
На самом деле, это был небольшой облом с моей стороны. Оказалось, что стол, что я имею в виду принадлежит к определенной схеме в БД и по умолчанию ORMLite выглядит для вещей в схеме DBO. Однако на этот раз схема была DATA вместо Dbo, и она начала сбой, потому что в схеме Dbo она не нашла ничего, что называется EmployeeHistory.
Я обнаружил, что это легко решить, украсив ваш класс атрибутом [Schema ("SchemaName")].
Убедитесь, что вы не игнорировали это поле в ModelDefinition OrmLite. Ниже приведена часть метода, который я написал для определения Ignore Field.
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();
}
GeographyId
должен бытьint?
если это обнуляемый иDateTime?
для обнуляемых дат. Также может помочь любая дополнительная информация о том, когда это происходит, например, db.Select <EmployeeHistory> () и, если возможно, включить stacktrace.