簡體   English   中英

Inisght.Database自動存儲庫和自定義列映射

[英]Inisght.Database Auto Repository and Custom Column Mapping

我正在嘗試在項目中實現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,我試圖提供一個接口,該接口將自動填充對象,並告訴它如何使用存儲過程中的不同列名作為“員工”屬性。

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

....

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

這可以正常工作(不會出錯),並且假期的所有屬性均已正確映射,但是我的兩個“員工”屬性為null(如預期的那樣,因為列名未與employee對象的屬性名對齊) )。 我不知道如何告訴Insight“使用CreatedBy ..”字段來構建“ Employee”屬性,以及如何告訴“ Approving ...”字段來構建“ ApprovedByEmployee”屬性。

我已經能夠使用具有回調和columnOverride的OneToOne來完成它,然后使用標准的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的自動界面功能。

我想做的事可能嗎?

組裝重復的子對象並不是當前自動完成的事情,並且接口實現沒有給您正確的鈎子以覆蓋行為。

一些選項:

答:更改結果集的形狀以將雇員作為具有屬性的列表返回。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM