2016-05-17 2 views
0

Мы видим проблему в 4.0.56, которую мы видели раньше (см. ОБНОВЛЕНИЕ 3 из ServiceStack - [Reference] or [Ignore]?), а именно: свойство идентификатора Employee заполняется значением TitleID.Ошибка сопоставления ServiceStack DTO

Запрос DTO является:

[Route("/employees", "GET")] 
public class FindEmployeesRequest : QueryDb<Employee>, 
    IJoin<Employee, EmployeeType>, 
    IJoin<Employee, Department>, 
    IJoin<Employee, Title> { 

    public int? ID { get; set; } 
    public int[] IDs { get; set; } 
    public string UserID { get; set; } 
    public string[] UserIDs { get; set; } 
    public int? EmployeeTypeID { get; set; } 
    public int[] EmployeeTypeIDs { get; set; } 
    public int? DepartmentID { get; set; } 
    public int[] DepartmentIDs { get; set; } 
    public int? TitleID { get; set; } 
    public int[] TitleIDs { get; set; } 
    public string LastNameStartsWith { get; set; } 
    public DateTime[] DateOfBirthBetween { get; set; } 
    public DateTime[] HireDateBetween { get; set; } 
    public bool? IsActive { get; set; } 
    public bool? IsEligibleToOrderLunch { get; set; } 

    [QueryDbField(Template = "(MONTH({Field}) = {Value})", Field = "DateOfBirth")] 
    public int? BirthMonth { get; set; } 

    [QueryDbField(Template = "(DAY({Field}) = {Value})", Field = "DateOfBirth")] 
    public int? BirthDay { get; set; } 

    [QueryDbField(Template = "({Field} LIKE '%(Incoming)')", Field = "EmployeeTypeName")] 
    public bool? IsIncoming { get; set; } 

    [QueryDbField(Template = "(FirstName LIKE {Value} OR LastName LIKE {Value} OR PreferredName LIKE {Value})", ValueFormat = "%{0}%", Field = "ID")] 
    public string NameSearch { get; set; } 

    [QueryDbField(Template = "(FirstName LIKE {Value} OR LastName LIKE {Value} OR PreferredName LIKE {Value} OR Department.Name LIKE {Value} OR Title.Name LIKE {Value})", ValueFormat = "%{0}%", Field = "ID")] 
    public string BasicSearch { get; set; } 

    [QueryDbField(Template = "({Field} LIKE {Value})", Field = "EmployeeTypeName", ValueFormat = "%{0}%")] 
    public string EmployeeTypeSearch { get; set; } 

    [QueryDbField(Template = "({Field} LIKE {Value})", Field = "DepartmentName", ValueFormat = "%{0}%")] 
    public string DepartmentSearch { get; set; } 

    [QueryDbField(Template = "({Field} LIKE {Value})", Field = "TitleName", ValueFormat = "%{0}%")] 
    public string TitleSearch { get; set; } 
} 

В принципе любой запрос, который делает "SELECT * FROM" имеет вопрос - вот некоторые SQL из Profiler для "/ сотрудников ид = 101 & поля = *?": .

exec sp_executesql N'SELECT * 
FROM "Employee" INNER JOIN "EmployeeType" ON 
("EmployeeType"."ID" = "Employee"."EmployeeTypeID") INNER JOIN "Department" ON 
("Department"."ID" = "Employee"."DepartmentID") INNER JOIN "Title" ON 
("Title"."ID" = "Employee"."TitleID") 
WHERE "Employee"."ID" = @0',N'@0 int',@0=101 

Когда я запускаю этот запрос, я, "Сотрудник" "ID" является 101, но в ответ от службы, это 67 (TitleID):

enter image description here

ответ

2

Вы не можете использовать голый шаблон ?fields=* на свой собственный, он должен включать префикс таблицы, например. ?fields=employee.* как mentioned in the docs, который является короткой рукой, вручную указывающей каждое поле в таблице.

+0

Спасибо @mythz - RTFM ... – jaybird

Смежные вопросы