编辑:Breeze JS忽略EF6导航属性;外键定义

时间:2015-01-08 16:02:40

标签: entity-framework breeze

我有三个实体:地区,网站和还款(实际上有大约十几个,但这些是重要的实体)。相关代码是:

public class Site 
{
    [Key, Column(Order = 0)]
    public int DistrictId { get; set; }
    [Key, Column(Order = 1)]
    public int SiteId { get; set; }

    public string Name { get; set; }

    public virtual District District { get; set; }
}

public class District 
{
    public int DistrictId { get; set; }
    public string Name { get; set; }

    public virtual ICollection<Repayment> Repayments { get; set; }
}

public class Repayment 
{
    [Key, Column(Order = 0)]
    public int DistrictId { get; set; }
    [Key, Column(Order = 1)]
    public int RepaymentId { get; set; }

    public string Name { get; set; }

    [InverseProperty("Repayments")]
    [ForeignKey("DistrictId")]
    public virtual District District { get; set; }
}

然后,在FluentAPI中我有:

        modelBuilder.Entity<Repayment>().HasRequired(r => r.District)
                    .WithMany(d => d.Repayments)
                    .HasForeignKey(r => new { r.DistrictId});

模型在C#端正确执行,当我使用适当的Include子句时,在区中将还款作为集合。然而,Breeze无法找到该区域下的还款集合(还款在其他几个实体的缓存中)。我已经尝试了Fluent API和Data Annotation的所有组合(仅使用数据注释,使用带有和不带流畅api的部分数据注释等),并且没有区别。

有趣的是,当我针对1.5.1版本的Context Provider和2.1.5.1版本的BreezeWebApi运行它时,客户端代码完美地工作(并填充区域下的还款)(不工作的版本是1.5 .2和2.1.5.2)。但是,我从一个不太复杂的模型移植到一个更复杂的模型,所以后端不完全相同(这些类的字节是字节相同)。

我很感激任何想法。

编辑: 我刚刚在工作现场安装了更新的版本(2.1.5.2和1.5.2),它没有引起任何问题。所以版本变化似乎不是罪魁祸首。还有其他我应该检查的事情吗?

TIA

编辑:更多信息 在一个区内,共有10个一对多导航属性,其中还款只有一个。其中8个正确填充(并以完全相同的方式定义),而其中两个(包括Repayments属性)则没有。在服务器端,所有10个属性都被识别并填充,而在客户端,Breeze仅将8个属性“连接”到区域(所有相关实体都在缓存中并连接到至少一个其他实体,只是没有区实体)。很奇怪。帮助

编辑:Curiouser和curiouser: 微风元数据似乎具有适当的导航属性定义。以下是地区实体中的还款(不工作)和季节性客户(工作)的NavProp定义:

        {
            "name": "Repayments",
            "relationship": "Self.Repayment_District",
            "fromRole": "Repayment_District_Target",
            "toRole": "Repayment_District_Source"
        },
        {
            "name": "SeasonClients",
            "relationship": "Self.SeasonClient_District",
            "fromRole": "SeasonClient_District_Target",
            "toRole": "SeasonClient_District_Source"
        },

以下是两个实体中如何定义区域的导航属性:

REPAYMENT导航属性:

        {
            "name": "District",
            "relationship": "Self.Repayment_District",
            "fromRole": "Repayment_District_Source",
            "toRole": "Repayment_District_Target"
        },

SEASON CLIENT导航属性:

        {
            "name": "District",
            "relationship": "Self.SeasonClient_District",
            "fromRole": "SeasonClient_District_Source",
            "toRole": "SeasonClient_District_Target"
        },

这是SeasonClient_District关系定义:

        {
        "name": "SeasonClient_District",
        "end": [{
            "role": "SeasonClient_District_Source",
            "type": "Edm.Self.SeasonClient",
            "multiplicity": "*"
        },
        {
            "role": "SeasonClient_District_Target",
            "type": "Edm.Self.District",
            "multiplicity": "1",
            "onDelete": {
                "action": "Cascade"
            }
        }],
        "referentialConstraint": {
            "principal": {
                "role": "SeasonClient_District_Target",
                "propertyRef": {
                    "name": "DistrictId"
                }
            },
            "dependent": {
                "role": "SeasonClient_District_Source",
                "propertyRef": {
                    "name": "DistrictId"
                }
            }
        }
    },

这与byte-for-byte相同(如果将'SeasonClient'替换为'Repayment')作为Repayment_District关系定义。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

J有类似的问题。在2014年6月(当时所有最新的库),以下客户端代码工作:

        return EntityQuery.from('FlowCharts')
        .withParameters({ flowChartId: 1 })
        .expand('Nodes.NodeFunction.NodeFunctionParameters, Connections')
        .using(manager).execute()
        .then(querySucceeded)
        .catch(_queryFailed);

但不是现在(2015年2月 - 更新到最新的libs之后)。将相关实体名称改为小写有帮助(请阅读@Ward调试技巧):

        return EntityQuery.from('flowCharts')
        .withParameters({ flowChartId: 1 })
        .expand('nodes.nodeFunction.nodeFunctionParameters, connections')
        .using(manager).execute()
        .then(querySucceeded)
        .catch(_queryFailed);

希望它有所帮助。 Grzech