【问题标题】:Breezejs/knockout - how do you combine entities?Breezejs/knockout - 你如何组合实体?
【发布时间】:2013-11-05 18:33:55
【问题描述】:

我对微风.js 很陌生,我需要能够组合两个实体。

现在,我无法在一次查询中获得所需的所有信息。我的解决方案是分别获取两个实体,然后在代码中组合。

这是两个查询:

         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、employeeID 和 LaborCategoryID 的外键。这允许我根据 taskID 加载员工及其 LaborCategories。

但是,我仍然需要每个员工的 predictedHours。 . .

ForecastedHours 按月输入,因此员工在一年中可能有很多条目(最多 12 个)。因此,没有可用于将 ForecastedHours 添加到第一个查询的适用导航属性。此表包含 taskID 和employeeID 的外键。因此,第二个是必要的。

我想在employee.ID 上加入这两个结果实体。最终,我将在网格中使用这些信息(通过淘汰赛/Durandal),显示员工姓名、劳动类别和 12 个月内的预测小时数。

这可能吗?加入这些实体会破坏任何使信息可更新的 Breeze.js 跟踪吗?

我也想知道通过淘汰赛的 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; }
}

【问题讨论】:

    标签: knockout.js breeze


    【解决方案1】:

    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)
    }
    

    【讨论】:

    • 您好 Dominictus,非常感谢您的回复和慷慨的帮助。我仍然没有得到预测的时间(尽管其他一切都通过 BreezeController 的 mods 实现)。不幸的是,我的 Employee 中没有这行:'public virtual ForecastedHours {get;set;}'。我尝试添加它,但格式似乎不起作用,因此我尝试了变体,例如“public virtual ForecastedHours Hours {get;set;}”。我将为上面的表格发布我的数据模型。还有其他想法吗?
    • 尝试在 ForecastHours 中的 Task 上删除外键,然后 Employee 应该能够拥有 ForecastHours。您真的应该尝试在纸上绘制模型并查看依赖关系,就像我看到的那样,有些东西闻起来很可疑,需要重新设计;)我相信 ForecastHour 不需要直接连接到 Task,否则,您可以通过查询 EmployeeLaborTasks 来连接它们(虽然不理想)
    • 我在 ForecastedHours 中删除了 Task 的外键,但仍然存在问题。就好像 Employee 本身需要一个引用 ForecastedHours 的外键。但这似乎是倒退的,因为一名员工将有很多小时的条目。我也尝试修复表中的依赖关系,但我仍然没有任何运气。
    • 知道了!只需要使用一个列表: public virtual List ForecastedHours { get;放; }。将此标记为已接受的答案。非常感谢多米尼克斯!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多