到目前为止花了两天时间。它快把我逼疯了。
一些链接的代码优先实体框架类:
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 服务进行数据传输。有人可以请,请帮忙吗?