我有在Web API的服务器端使用继承的C#类。基类/超类具有一些“一两个”导航属性,这些属性对于所有继承的类是通用的。这些课程不是EF或NH课程。
Breeze在元数据中正确生成基类和继承的类,并在继承的类上正确显示基类的导航属性。
从API加载数据时,breeze正确地“链接”“Child” - >链接导航属性的“父”一侧,但不映射反向“父” - >基类上的“孩子”关系。
如果我将导航属性移动到继承的子类,则从base / super类中移出,然后Breeze正确地链接从Parent到Child和Child到Parent的所有关系。
public class Fine
{
public int Id { get; set; } // Primary Key
public int VehicleId {get; set; } // Foreign Key
public decimal Amount { get; set; }
... etc
}
public class Vehicle
{
public int Id { get; set; } //Primary Key
... other common properties
public IList<Fine> Fines { get; set; } // Common nav property
}
public class Motorcycle
{
public string MudguardColour { get; set; }
... other specific properties
}
public class MotorVehicle
{
public string BumperColour { get; set; }
... other specific properties
}
Breeze在客户端创建正确反映上述形状的实体,并且具有ko.observable以及ko.observablearray用于一对多(Vehicle - &gt; Fines)属性。
如果我首先向服务器查询MotorVehicles和MotorCycles列表,那么一切都很好。然后我单独查询列表中的罚款,并且breeze正确链接与特定车辆相关的“罚款”。我可以说“fine.motorVehicle.id”或“fine.motorCycle.id”,具体取决于类型并获得基类/超类属性,如Id。
然而,Breeze不会链接“vehicle.fines”,“motorVehicle.fines”和“motorCycle.fines”导航属性。它们仍然是空阵列,即使“精细”实体正确地链接到车辆,motorVehicle和motorCycle实体。
如果我将导航属性移动到子/继承类,则breeze会按预期正确链接实体。
public class Fine
{
public int Id { get; set; } // Primary Key
public int VehicleId {get; set; } // Foreign Key
public decimal Amount { get; set; }
... etc
}
public class Vehicle
{
public int Id { get; set; } //Primary Key
... other common properties
//public IList<Fine> Fines { get; set; } // Common nav property
}
public class Motorcycle
{
public string MudguardColour { get; set; }
... other specific properties
public IList<Fine> Fines { get; set; } // Common nav property now in child class
}
public class MotorVehicle
{
public string BumperColour { get; set; }
... other specific properties
}
这给了我“fine.vehicle.id”,“fine.motorVehicle.bumperColour”和“fine.MotorCycle.mudguardColour”以及父母 - &gt;子关系“vehicle.fines [0] .amount和”motorCycle.fines [0] .amount“。
如何在基础/超类上设置这些导航属性以避免在子/继承类上重复它们?
PS:我没有使用EF或NH,但我的元数据是基于NH布局(来自微风NH样本)以及带有所需外键相关的Breeze文档等建模的。
PPS:对于不使用继承设置的普通类,所有这些都可以100%工作。
希望我已经充分解释了?
答案 0 :(得分:0)
上述问题的解决方案是确保Base类和导航属性类的“associationName”在其元数据中具有相同的“association”属性“name”。
基类:
navigationProperties: [{nameOnServer: Fine, entityTypeName: Fine, isScalar: false, associationName: AN_Fine_FineId, invForeignKeyNamesOnServer: [Id]
相关课程:
navigationProperties: [{nameOnServer: Vehicle, entityTypeName: Vehicle, isScalar: true, associationName: AN_Fine_FineId, foreignKeyNamesOnServer: [Id]}]