【问题标题】:Inisght.Database Auto Repository and Custom Column MappingInsight.Database 自动存储库和自定义列映射
【发布时间】:2018-10-24 23:54:47
【问题描述】:

我正在尝试在项目中实现 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;}
}

我的数据库看起来像......

表:员工(员工代码,[姓名])

表:假期(VacationId、VacationDate、EmployeeCode、ApprovedByEmployeeCode)

视图:VacationsView(所以我不必一直写 [和更改] 一遍又一遍地选择相同的选择)

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,我尝试创建一个接口,该接口将自动填充我的对象并告诉它如何将存储过程中的不同列名用于“员工”属性。

public interface IMyRepository
{
    IList<Vacation> GetAllVacations();
}

....

var repo = conn.As<IMyRepository>();
return repo.GetAllVacations();

这有效(因为没有错误)并且我的假期的所有属性都已正确映射,但我的两个“员工”属性为空(正如预期的那样,因为列名与一个雇员对象)。我想不通的是如何告诉 Insight“使用 CreatedBy ..”字段来构建“员工”属性和“批准...”字段来构建“ApprovedByEmployee”属性。

我已经能够使用带有回调和 columnOverride 的 OneToOne 来完成它,然后使用标准的 Query()。即..

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 的自动界面功能。

我正在尝试做的事情可能吗?

【问题讨论】:

    标签: c# insight.database


    【解决方案1】:

    组装重复的子对象目前不是自动完成的,接口实现也没有为您提供覆盖行为的正确钩子。

    一些选项:

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多