Я пытаюсь внедрить 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)
View: 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();
Это работает (как и не ошибка), и все свойства моего отпуска правильно сопоставлены, но мои два свойства "работника" равны нулю (как и ожидалось, поскольку имена столбцов не совпадают с именами свойств объекта сотрудника).Что я не могу понять, так это сказать, как 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.
Возможно ли то, что я пытаюсь сделать?