到目前为止花了两天时间。这让我疯了。
一些链接的代码优先实体框架类:
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();
我收回了我需要的一切。当序列化为Json以获得Web服务时,它看起来很好,很花哨,并且所有数据都是可靠的。
然而,只要它传递给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 of Charge,而不是用以下标记来标记:
[Key, ForeignKey("Charge"), DatabaseGenerated(DatabaseGeneratedOption.Identity)]
这似乎不对 - 这里有多对一的关系,所以我不应该删除ICollection。毫无疑问,对此EF的查询总是返回带有DevType:null的Charge对象。但在这种情况下,Breeze实际上确实选择了DevTypes - 它只是显然是null。
我即将在这里撕毁Breeze并直接依赖我的网络服务进行数据传输。有人可以请帮忙吗?
答案 0 :(得分: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&gt;收费所以您应该使用全名(费用)加载它们