Inisght.Database Auto Repository и пользовательское сопоставление столбцов - PullRequest
0 голосов
/ 17 октября 2018

Я пытаюсь внедрить 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.

Возможно ли то, что я пытаюсь сделать?

1 Ответ

0 голосов
/ 24 октября 2018

Сборка повторяющихся дочерних объектов в настоящее время не выполняется автоматически, и реализация интерфейса не дает правильных возможностей для переопределения поведения.

Некоторые параметры:

A.Измените форму набора результатов, чтобы вернуть сотрудников в виде списка со свойствами.

B.Если классы не запечатаны, производные от Employee позволяют Insight различать классы:

public class AssigningEmployee : Employee { public string AssigningName { get { return Name; } set { Name = Value; } } ... }

Все эти решения meh .Весь смысл Insight.Database состоит в том, чтобы просто работал без большой дополнительной работы.Итак ...

Я открыл проблему GitHub для отслеживания этого:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...