Автоматический репозиторий 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 для отслеживания этого:

https://github.com/jonwagner/Insight.Database/issues/384

Другие вопросы по тегам