这篇文章(https://stackoverflow.com/a/14486260/894358)表明Breeze确实支持继承,但我的breeze管理器无法理解从API返回的元数据。服务器将返回元数据和其他操作方法的JSON结果,但是当管理器尝试解释元数据时,它会抛出错误:“无法读取未定义的propertyRef”。
这是我非常简单的实现(Code First Migrations生成数据库):
namespace VerySimpleVehicleModel.Models
{
public abstract class Vehicle
{
public int Id { get; set; }
public int Speed { get; set; }
}
public class Bus: Vehicle
{
public int Capacity { get; set; }
}
public class Car : Vehicle
{
public string Color { get; set; }
}
public class VehicleContext : DbContext
{
public DbSet<Car> Cars { get; set; }
public DbSet<Bus> Buses { get; set; }
public DbSet<Vehicle> Vehicles { get; set; }
}
}
namespace VerySimpleVehicleModel.Controllers
{
[BreezeController]
public class BreezeController : ApiController
{
readonly EFContextProvider<VehicleContext> _contextProvider = new EFContextProvider<VehicleContext>();
[HttpGet]
public string Metadata()
{
return _contextProvider.Metadata();
}
[HttpGet]
public IQueryable<Car> Cars()
{
return _contextProvider.Context.Cars;
}
}
}
以下是元数据操作方法返回的元数据:
"{
\"schema\":
{
\"namespace\":\"VerySimpleVehicleModel.Models\",
\"alias\":\"Self\",
\"d4p1:UseStrongSpatialTypes\":\"false\",
\"xmlns:d4p1\":\"http://schemas.microsoft.com/ado/2009/02/edm/annotation\",
\"xmlns\":\"http://schemas.microsoft.com/ado/2009/11/edm\",
\"cSpaceOSpaceMapping\":\"
[
[
\\\"VerySimpleVehicleModel.Models.Vehicle\\\",
\\\"VerySimpleVehicleModel.Models.Vehicle\\\"
],
[
\\\"VerySimpleVehicleModel.Models.Car\\\",
\\\"VerySimpleVehicleModel.Models.Car\\\"
],
[
\\\"VerySimpleVehicleModel.Models.Bus\\\",
\\\"VerySimpleVehicleModel.Models.Bus\\\"
]
]
\",\"entityType\":
[
{
\"name\":\"Car\",
\"baseType\":\"Self.Vehicle\",
\"property\":
{
\"name\":\"Color\",
\"type\":\"Edm.String\",
\"fixedLength\":\"false\",\"maxLength\":\"Max\",
\"unicode\":\"true\",\"nullable\":\"true\"
}
},
{
\"name\":\"Bus\",
\"baseType\":\"Self.Vehicle\",
\"property\":{\"name\":\"Capacity\",
\"type\":\"Edm.Int32\",\"nullable\":\"false\"}
},
{
\"name\":\"Vehicle\",
\"abstract\":\"true\",
\"key\":{\"propertyRef\":{\"name\":\"Id\"}},
\"property\":
[
{\"name\":\"Id\",\"type\":\"Edm.Int32\",\"nullable\":\"false\",\"d4p1:StoreGeneratedPattern\":\"Identity\"},
{\"name\":\"Speed\",\"type\":\"Edm.Int32\",\"nullable\":\"false\"}
]
}
]
,\"entityContainer\":
{
\"name\":\"VehicleContext\",
\"entitySet\":
{
\"name\":\"Vehicles\",
\"entityType\":\"Self.Vehicle\"
}
}
}
}"
答案 0 :(得分:2)
我无法重现您的示例问题。事实上,它就像一个魅力。
我几乎逐字地将它复制到the DocCode sample,因为它非常简单,在进入BillingDetails示例(将发布下一个版本)的复杂性之前我们需要一个简单的。(/ p>
这是一个带有抽象基类的标准TPH模型。关键在元数据中得到认可;查看此行的Vehicle
基类:
\"key\":{\"propertyRef\":{\"name\":\"Id\"}},
奇怪的是您正在接收旧字符串格式的元数据。当我在测试运行中查看元数据的有效负载时,我得到一个JSON对象:
{"schema":{"namespace":"Inher ... "entityType":[{"name":"Vehicle", "abstract":"true", "key":{"propertyRef":{"name":"Id"}}, ... }]}]}}}
我怀疑您有 Breeze.WebApi.dll 的旧副本。也许你更新了Breeze NuGet包,旧的程序集被困在引用中,或者保留了一个旧的脚本文件。尝试卸载并重新安装Breeze。仔细查看NuGet控制台日志,确保所有内容都已更换。