错误的导航属性/一对零或一个关系

时间:2013-01-15 00:39:29

标签: breeze

这是我的用户模型:

public User{
   ... (no navigation Property to modeltype)

}

以下型号的灵感来自DocCode OrderDetails->产品,其中只有OrderDetail具有产品的外键。 对于此配置,我收到来自breeze的错误消息:用户SB和TL的“导航属性不良”,但不是MA。

public modeltype{
  public DateTime? ClosedBySB { get; set; }

    public long? SBId { get; set; }
    [ForeignKey("SBId")]
    public User SB { get; set; }

    public DateTime? ClosedByTL { get; set; }

    public long? TLId { get; set; }
    [ForeignKey("TLId")]
    public User TL { get; set; }

    public DateTime? ClosedByMA { get; set; }

    public long? MAId { get; set; }
    [ForeignKey("MAId")]
    public User MA { get; set; }
    ....
}

虽然这有效:

public modeltype{
  public DateTime? ClosedBySB { get; set; }

    //public long? SBId { get; set; }
    //[ForeignKey("SBId")]
    //public User SB { get; set; }

    public DateTime? ClosedByTL { get; set; }

    //public long? TLId { get; set; }
    //[ForeignKey("TLId")]
    //public User TL { get; set; }

    public DateTime? ClosedByMA { get; set; }

    public long? MAId { get; set; }
    [ForeignKey("MAId")]
    public User MA { get; set; }
    ....
}

我认为这应该有效吗? 没有额外的Fluent Api配置。 谢谢你的帮助。

4 个答案:

答案 0 :(得分:1)

当模型包含2个具有相同类型(1对1关系)的属性时,我遇到了同样的问题。我必须深入了解微风的逻辑与协会解决这个问题。如果当前关联具有两端,似乎breeze分析它们中的每一个并从temp数组中移除。否则breeze会显示“错误的导航属性”错误。如果具有相同类型的多个1对1属性,则除了第一个属性之外,breeze将删除所有这些1对1关系的一端,并显示错误。尝试在breeze.js中的“addToIncompleteMap”函数中更改此字符串:

  incompleteTypeMap[np.entityTypeName] = assocMap;

if (incompleteTypeMap[np.entityTypeName]) 
  (incompleteTypeMap[np.entityTypeName])[np.associationName] = np;
else
   incompleteTypeMap[np.entityTypeName] = assocMap;

答案 1 :(得分:1)

从breeze v 1.0.0开始修复此错误。并感谢谢尔盖指出解决方案。

答案 2 :(得分:0)

我怀疑是EF配置问题。

如果有一个导航返回相关的用户实体,但是当您有三个此类导航属性时失败,则会成功。你没有[InverseProperty]来帮助EF解决这个问题,因为你不希望用户的导航属性回到ModelType(我可以想象你为什么不想要它们)。

我认为你必须使用Fluent API告诉EF你的意思。

答案 3 :(得分:0)

我注释掉了ForeignKey属性并将其放在ModelType的Config文件中:

HasOptional(p => p.SB)
            .WithMany()
            .HasForeignKey(s => s.SBId)
            .WillCascadeOnDelete(false);

        HasOptional(p => p.TL)
        .WithMany()
        .HasForeignKey(s => s.TLId)
        .WillCascadeOnDelete(false);

        HasOptional(p => p.MA)
        .WithMany()
        .HasForeignKey(s => s.MAId)
        .WillCascadeOnDelete(false);

但这会产生同样的错误。 SB和TL抛出bad nav property异常。导航属性必须可以为空,因此我使用了HasOptional()。 我不知道在哪里放置任何其他配置,因此breeze识别entityType(未定义为SB / TL,因为异常)。