微风不包括链接的实体

时间:2013-07-22 14:26:26

标签: entity-framework ef-code-first breeze

到目前为止花了两天时间。这让我疯了。

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

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并直接依赖我的网络服务进行数据传输。有人可以请帮忙吗?

1 个答案:

答案 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;收费所以您应该使用全名(费用)加载它们