2013-11-04 3 views
1

저는 breeze.js에 새롭기 때문에 두 엔티티를 결합 할 수 있어야합니다.Breezejs/knockout - 엔티티를 어떻게 결합합니까?

지금은 하나의 쿼리에서 필요한 모든 정보를 얻을 수 없습니다. 내 솔루션은 별도로 두 엔티티를 얻은 다음 코드로 결합하는 것입니다. 여기

는 두 쿼리입니다

  var query = breeze.EntityQuery 
     .from("EmployeeLaborTasks") 
     .where("task_ID", "==", taskID) 
     .orderBy("employee_ID") 
     .expand(["Employee", "LaborCategory"]); 


     var query = breeze.EntityQuery 
     .from("ForecastedHours") 
     .where("task_ID", "==", taskID) 
     .expand("Employee"); 

EmployeeLaborTasks가되어 TASKID, 직원 ID 및 LaborCategoryID에 대한 외래 키와 조인 테이블. 이를 통해 taskID를 기반으로 Employees와 LaborCategory를로드 할 수 있습니다.

그러나 나는 아직도 각 직원의 예측 된 Hours가 필요합니다. . .

ForecastedHours는 월별로 입력되므로 직원이 1 년 (최대 12 시간) 동안 많은 항목을 가질 수 있습니다. 이 때문에 첫 번째 쿼리에 ForecastedHours를 추가하는 데 사용할 수있는 적용 가능한 탐색 속성이 없습니다. 이 테이블에는 taskID 및 employeeID에 대한 외래 키가 들어 있습니다. 따라서 두 번째 것이 필요합니다.

employee.ID에 두 개의 결과 엔터티를 결합하고 싶습니다. 궁극적으로, 나는 12 개월 동안 직원 이름, 노동 범주 및 예측 시간을 표시하는 그리드 (녹아웃/듀란 달을 통해)에서이 정보를 사용합니다.

이것이 가능합니까? 이 엔티티에 가입하면 Breeze.js 추적이 망가져 정보를 업데이트 할 수 있습니까?

나는 또한 knockout의 ko.computed를 통해 그들을 결합하는 것이 더 좋을지 궁금하지만이 작업을 수행하는 방법을 잘 모르겠습니다.

도움을 주시면 감사하겠습니다. 아래 Dominictus, 나는 문제의 테이블에 대한 데이터 모델을 게시하고 응답에서


:

public class Employee : Person 
{ 
    [Key] 
    public int ID { get; set; } 
    public string CompanyEmployeeID { get; set; } 
    public decimal Salary { get; set; } 
    public decimal UtilizationTarget { get; set; } 
    public virtual Office OfficeLocation { get; set; } 
    public virtual Department Department { get; set; } 
    public virtual JobGrade JobGrade { get; set; } 
} 



public class EmployeeLaborTasks 
{ 
    [Key] 
    public int ID { get; set; } 

    public virtual Employee Employee { get; set; } 
    [ForeignKey("Employee")] 
    public int Employee_ID { get; set; } 

    public virtual Task Task { get; set; } 
    [ForeignKey("Task")] 
    public int Task_ID { get; set; } 

    public virtual LaborCategory LaborCategory { get; set; } 
    [ForeignKey("LaborCategory")] 
    public int LaborCategory_ID { get; set; } 
} 


public class ForecastedHours 
{ 
    [Key] 
    public int ID { get; set; } 
    [Required] 
    public double Hours { get; set; } 
    [Required] 
    public DateTime Date { get; set; } 

    [Timestamp] 
    public Byte[] LastModified { get; set; } 
    public virtual User ModifiedBy { get; set; } 

    public virtual Employee Employee { get; set; } 
    public virtual Task Task { get; set; } 

    [ForeignKey("Task")] 
    public int Task_ID { get; set; } 

    [ForeignKey("Employee")] 
    public int Employee_ID { get; set; } 
} 


public class Task 
{ 
    [Key] 
    public int ID { get; set; } 
    [Required] 
    public string Name { get; set; } 
    public int Number { get; set; } 

    [ForeignKey("Contract")] 
    public int ContractID { get; set; } 

    public virtual Contract Contract { get; set; } 

    [Timestamp] 
    public Byte[] LastModified { get; set; } 
    public virtual User ModifiedBy { get; set; } 
} 


public class LaborCategory 
{ 
    [Key] 
    public int ID { get; set; } 
    [Required] 
    public string Name { get; set; } 
    public decimal Rate { get; set; } 
    public virtual Contract Contract { get; set; } 
    [Timestamp] 
    public Byte[] LastModified { get; set; } 
    public virtual User ModifiedBy { get; set; } 
} 

답변

2

Breeze는 좀 더 강력한 이것보다이며 당신이 원하는 방식으로 작업을 수행 할 수 있습니다. BreezeController에서

만들 :

[HttpGet] 
public IQueryable<EmployeeLaborTasks> NameHere(){ 
    return _contextProvider.Context.EmployeeLaborTasks.Include("Employee").Include("LaborCategory").Include("Employee.ForecastedHours"); 
} 

나는 직원이

public virtual <ForecastedHour> ForecastedHours {get;set;} 

을 가지고 있으며, 또한 EmployeeLaborTasks (이 그것이 다른 모든 연결에 대해 정의되어야한다, 단지 직원입니다)

이 있다고 가정합니다
public int EmployeeId {get;set;} 
[ForeignKey("EmployeeId")] 
public Employee Employee {get;set;} 

그런 다음 클라이언트에 하나의 검색어 만 쓸 수 있습니다.

var query = breeze.EntityQuery 
    .from("NameHere") 
    .where("task_ID", "==", taskID) 
    .orderBy("employee_ID") 

모든 것을 하나의 관찰 변수에 넣습니다. 그리드에 배치하려면 다음과 같이하십시오 (여기 의사 코드) :

foreach employeeLaborTasks as singleTask{ 
    display (singleTask.employee.name) 
    display (singleTask.laborCategory.name) 
    foreach (singleTask.employee.forecastedHours as singleForecast){ 
     display (singleForecast.name) 
    } 
    display (newline) 
} 
+0

안녕하십니까, 귀하의 회신과 많은 도움에 감사드립니다. 아직 예상 시간을 얻지 못하고 있습니다 (다른 모든 것은 BreezeController의 개조를 통해 이루어집니다). 불행히도 필자는 'Public virtual ForecastedHours {get; set;}'를 내 직원에게주지 않았습니다.추가를 시도했지만 형식이 제대로 작동하지 않는 것 같아서 'public virtual ForecastedHours Hours {get; set;}'와 같은 변형을 시도했습니다. 위 테이블에 대한 데이터 모델을 게시합니다. 다른 아이디어? – Jimbo

+0

ForecastHours의 Task에 외래 키를 놓으십시오. 그러면 Employee가 ForecastHours를 가질 수 있어야합니다. 모델에 종이를 그려야하고 의존성을보아야한다. 내가 보는 방식, 뭔가 냄새를 맡고 재 설계해야한다.) ForecastHour가 Task에 직접 연결될 필요는 없다고 생각한다. 그렇지 않으면 EmployeeLaborTasks를 쿼리하여 연결할 수있다. (이상한 것은 아님) – Dominictus

+0

ForecastedHours에서 Task의 외래 키를 삭제했지만 여전히 문제가 있습니다. ForecastedHours를 참조하는 Employee 자체에 외래 키가 필요한 것입니다. 그러나 그것은 한 직원에게 많은 시간 항목이 있기 때문에 거꾸로 보입니다. 또한 테이블의 종속성을 수정하려고 시도했지만 여전히 운이 좋지 않습니다. – Jimbo

관련 문제