Автоматический репозиторий Inisght.Database и сопоставление пользовательских столбцов
Я пытаюсь реализовать Insight.Database в проекте и натолкнулся на кирпичную стену, пытаясь использовать автоматическую реализацию интерфейса И сопоставляя свойства объекта с нечетными именами столбцов в базе данных.
У меня есть следующая структура...
class Employee
{
string EmployeeCode {get; set;}
string Name {get; set;}
}
class Vacation
{
int VacationId {get; set;}
DateTime VacationDate {get; set;}
string EmployeeCode {get; set;}
string ApprovedByEmployeeCode {get; set;}
Employee Employee {get; set;}
Employee ApprovedByEmployee {get; set;}
}
Моя база выглядит как....
Таблица: Сотрудники (EmployeeCode, [Имя])
Таблица: каникулы (VacationId, VacationDate, EmployeeCode, ApprovedByEmployeeCode)
Вид: VacationsView (поэтому мне не нужно продолжать писать [и изменять] один и тот же SELECT снова и снова)
SELECT v.VacationId, v.VacationDate, v.EmployeeCode, v.ApprovedByEmployeeCode, e1.EmployeeCode AS CreatedByEmployeeCode, e1.[Name] AS CreatedByName, e2.EmployeeCode AS ApprovingEmployeeCode, e2.[Name] AS ApprovingName
FROM Vacations v
INNER JOIN Employees e1 ON v.EmployeeCode = e1.EmployeeCode
INNER JOIN Employees e2 ON v.ApprovedByEmployeeCode = e2.EmployeeCode
Хранимая процедура: GetAllVacations
SELECT * FROM VacationsView
Наконец, в Insight.Database я пытаюсь создать интерфейс, который будет автоматически заполнять мои объекты и сообщать ему, как использовать разные имена столбцов из моей хранимой процедуры для свойств "employee".
public interface IMyRepository
{
IList<Vacation> GetAllVacations();
}
....
var repo = conn.As<IMyRepository>();
return repo.GetAllVacations();
Это работает (как и не ошибка), и все свойства моего отпуска правильно сопоставлены, но мои два свойства "employee" имеют значение null (как и ожидалось, потому что имена столбцов не совпадают с именами свойств объекта сотрудника). Что я не могу понять, так это сказать, как Insight "Использовать CreatedBy.." для создания свойства "Сотрудник" и "Approving..." для построения свойства "ApprovedByEmployee".
Я смог сделать это с помощью OneToOne с обратным вызовом и columnOverride, а затем использовать стандартный Query(). IE.
var vacationStructure =
new OneToOne<Vacation, Employee, Employee>(
callback: (vacation, createdBy, approvedBy) =>
{
vacation.Employee = createdBy;
vacation.ApprovedByEmployee = approvedBy;
}, columnOverride: new ColumnOverride[]
{
new ColumnOverride<EmployeeModel>("CreatedByEmployeeCode", "EmployeeCode"),
new ColumnOverride<EmployeeModel>("CreatedByName", "Name"),
new ColumnOverride<EmployeeModel>("ApprovingEmployeeCode", "EmployeeCode"),
new ColumnOverride<EmployeeModel>("ApprovingName", "Name")
});
....
var results = await conn.QueryAsync("GetAllVacations", new {employeeCode}, Query.Returns(_vacationStructure));
Тем не менее, я действительно пытаюсь использовать возможности автоматического интерфейса Insight.
Возможно ли то, что я пытаюсь сделать?
1 ответ
Сборка повторяющихся дочерних объектов в настоящее время не выполняется автоматически, и реализация интерфейса не дает правильных возможностей для переопределения поведения.
Некоторые варианты:
A. Измените форму вашего результирующего набора, чтобы вернуть сотрудников в виде списка со свойствами.
B. Если классы не запечатаны, производные от Employee, чтобы Insight могла различать классы:
public class AssigningEmployee : Employee {
public string AssigningName { get { return Name; } set { Name = Value; } }
...
}
Эти решения все ме. Весь смысл Insight.Database состоит в том, чтобы просто работать без большой дополнительной работы. Так...
Я открыл вопрос GitHub для отслеживания этого: