我有一些C#类在Web API的服务器端使用继承。基类/超级类具有一些"一对二多"导航属性,这些属性对所有继承的类都是通用的。这些类别不是EF或NH类别。
Breeze在元数据中正确生成基类和继承类,并在继承类上正确显示基类的导航属性。
从API加载数据时,微风正确地"链接"链接导航属性的"子"->"父"侧,但不映射基类上的反向"父"->"子"关系。
如果我将导航属性移动到继承的子类,从基类/超级类中移出,那么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.obsservablearray的一对多(Vehicle->Fines)属性。
如果我先在服务器上查询摩托车和摩托车的列表,一切都很好。然后,我分别查询罚款列表,并正确链接与特定车辆相关的"罚款"。我可以说"fine.motorVehicle.id"或"fine.motorCycle.id",这取决于类型,并获得基类/超类属性,如id。
然而,Breeze并没有将"vehicle.fines"、"motorVehicle.fines"或"motorCycle.fines"导航属性联系起来。即使"精细"实体正确链接到车辆、摩托车和摩托车实体,它们仍然是空数组。
如果将导航属性移动到子类/继承类,则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.bumprColour"one_answers"fine.MotorCycle.mudguardColour",以及父->子关系"vehicle.fines[0]。amount"one_answers"MotorCycle.fines[0]。amont"。
当这些导航属性在基类/超级类上时,我如何轻松设置它们,以避免在子类/继承类上重复它们?
PS:我既不使用EF也不使用NH,但我的元数据是基于NH布局(来自breeze NH样本)以及breeze文档以及所需的外键等进行建模的。
PPS:所有这些都适用于不使用继承设置的普通类。
希望我已经充分解释了?
上述问题的解决方案是确保基类和导航属性类的"associationName"在其元数据中具有相同的"关联"属性"名称"。
基本类别:
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]}]