1

到目前为止花了两天时间。它快把我逼疯了。

一些链接的代码优先实体框架类:

public class Schedule
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid RowId { get; set; }
    public DateTime Start { get; set; }
    public DateTime End { get; set; }
    public virtual ICollection<Charge> Charges { get; set; }
}

public class Charge
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid RowId { get; set; }
    public decimal ChargeableRate { get; set; }
    public DevType DevType { get; set; }
    public Schedule Schedule { get; set; }
}

public class DevType
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid RowId { get; set; }
    public string Type { get; set; }
    public virtual ICollection<Charge> Charge { get; set; }
}

我向实体框架询问这样的时间表:

        _schedule Schedule = _myContext.Schedules
                .Include("Charges.DevType")
                .Where(cs => cs.Start < dateWindow && cs.End > dateWindow)
                .First();

我拿回了我需要的一切。当为 Web 服务序列化为 Json 时,一切看起来都很好,而且所有数据都符合要求。

但是,一旦它传递给 Breeze,我就会丢失堆栈底部的 DevType 对象。它们不是空的,也不是空的,它们根本不存在。

在浏览器中暂停并深入 metadataStore._entityResourceMap 可以找到已注册的 DevType,因此 Breeze 清楚地知道它作为模型的一部分存在。它似乎看不到 Charge 和 DevType 之间的关系,所以忽略它。

我已经尝试了各种各样的东西——在 EF 中显式地注册关系(奇怪的是导致在数据库中添加了空列),使用 Breeze 中的 .expand 命令强制它加载:

 function getCurrentChargingSchedule() {
var query = breeze.EntityQuery.from('GetCurrentSchedule').expand('Charge.DevType');
return manager.executeQuery(query);
}; 

没有任何区别。

我得到的最接近的是从 DevType 中删除虚拟 ICollection 的 Charge ,而是使用以下标记:

[Key, ForeignKey("Charge"), DatabaseGenerated(DatabaseGeneratedOption.Identity)]

这似乎不对 - 这里有一个多对一的关系,所以我不应该删除 ICollection。毫不奇怪,使用此功能对 EF 进行的查询总是返回带有 DevType: null 的 Charge 对象。但在这种情况下,Breeze 确实选择了 DevTypes——只是它们显然是空的。

我即将在这里撕毁 Breeze 并直接依赖我的 Web 服务进行数据传输。有人可以请,请帮忙吗?

4

1 回答 1

0

您是否尝试过使用 Expand 加载费用?

function getCurrentChargingSchedule() {
    var query = breeze.EntityQuery.from('GetCurrentSchedule').expand('Charges, Charges.DevType');
    return manager.executeQuery(query).fail(queryFailed);
};

function queryFailed (error) {
    console.log(error.message);
}

您的导航属性是 Schedule > Charges,因此您应该使用全名 (Charges) 加载它们

于 2013-07-23T01:49:06.310 回答