继承的基类上的Breeze导航属性不会将父映射映射到子级

时间:2014-10-27 19:23:01

标签: c# inheritance asp.net-web-api breeze

我有在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%工作。

希望我已经充分解释了?

1 个答案:

答案 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]}]