C# 数据库自动存储库和自定义列映射

C# 数据库自动存储库和自定义列映射,c#,insight.database,C#,Insight.database,我试图在一个项目中实现Insight.Database,但在试图利用自动接口实现并将对象属性映射到数据库中的奇数列名时遇到了困难 我有以下结构 class员工 { 字符串EmployeeCode{get;set;} 字符串名称{get;set;} } 班级假期 { int VacationId{get;set;} DateTime VacationDate{get;set;} 字符串EmployeeCode{get;set;} 字符串ApprovedByEmployeeCode{get;set;

我试图在一个项目中实现Insight.Database,但在试图利用自动接口实现并将对象属性映射到数据库中的奇数列名时遇到了困难

我有以下结构

class员工
{
字符串EmployeeCode{get;set;}
字符串名称{get;set;}
}
班级假期
{
int VacationId{get;set;}
DateTime VacationDate{get;set;}
字符串EmployeeCode{get;set;}
字符串ApprovedByEmployeeCode{get;set;}
雇员雇员{get;set;}
Employee ApprovedByEmployee{get;set;}
}
我的数据库看起来像

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

表:休假(休假ID、休假日期、员工代码、ApprovedByEmployeeCode)

视图:VacationsView(因此我不必一直写[和更改] 相同的(反复选择)

存储过程:GetAllVacations

最后,使用Insight.Database,我尝试创建一个接口,该接口将自动填充我的对象,并告诉它如何使用存储过程中的不同列名作为“employee”属性

公共接口IMyRepository
{
IList GetAllVacations();
}
....
var repo=连接组件();
return repo.GetAllVacations();
这可以正常工作(如在“不出错”中),并且我的假期的所有属性都正确映射,但我的两个“employee”属性为空(正如预期的那样,因为列名与employee对象的属性名不一致)。我搞不懂的是如何告诉Insight“Use CreatedBy..”字段来构建“Employee”属性,“Approval…”字段来构建“ApprovedByEmployee”属性

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

var休假结构=
新奥涅托内(
回调:(假期,创建人,批准人)=>
{
休假.Employee=createdBy;
休假。ApprovedByEmployee=approvedBy;
},columnOverride:新建columnOverride[]
{
新列覆盖(“CreatedByEmployeeCode”、“EmployeeCode”),
新ColumnOverride(“CreatedByName”、“Name”),
新列覆盖(“ApprovingEmployeeCode”、“EmployeeCode”),
新的ColumnOverride(“ApprovingName”、“Name”)
});
....
var results=await conn.QueryAsync(“GetAllVacations”,new{employeeCode},Query.Returns(_vacationStructure));
然而,我确实在尝试利用Insight的自动界面功能


我试图做的是可能的吗?

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

一些选择:

A.更改结果集的形状,以将员工作为带有属性的列表返回

B.如果类未密封,则从Employee派生,以便Insight能够区分这些类:


公共类分配雇员:雇员{
公共字符串赋值名称{get{return Name;}set{Name=Value;}}
...
}

这些解决方案都是meh。Insight.Database的全部目的是只需工作,而无需大量额外工作。所以

我打开了一期github来跟踪这一点:

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
SELECT * FROM VacationsView