微风Web API与非常简单的表每层次继承结构
本文关键字:层次 继承 结构 简单 Web API 非常 微风 | 更新日期: 2023-09-27 18:14:37
这篇文章(https://stackoverflow.com/a/14486260/894358)表明Breeze确实支持继承,但是我的Breeze管理器不能理解从API返回的元数据。服务器将从其他操作方法返回元数据和JSON结果,但是当管理器试图解释元数据时,它会抛出错误:"Cannot read propertyRef of undefined"。
这是我非常简单的实现(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;
}
}
}
下面是metadata操作方法返回的元数据:
"{
'"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'"
}
}
}
}"
我无法重现您的示例中的问题。事实上,它很有魅力。
我几乎一字不差地把它复制到DocCode示例中,因为它太简单了,在进入BillingDetails示例的复杂性之前,我们需要一个简单的示例(将发布下一个版本)。
这是一个带有抽象基类的标准TPH模型。键在元数据中被识别;查看这一行的Vehicle
基类:
奇怪的是你接收的元数据是旧的字符串格式。当我在测试运行中查看元数据的有效负载时,我得到一个JSON对象:
<>之前{"模式":{"名称":"她……"entityType":[{"名称":"汽车","摘要":"真正的","关键":{"propertyRef":{"名称":" Id "}},…}}]}}}之前我怀疑你有Breeze.WebApi.dll的旧副本。也许您更新了Breeze NuGet包,旧的程序集被困在引用中,或者保留了旧的脚本文件。尝试卸载和重新安装Breeze。仔细查看NuGet控制台日志,确保所有内容都已替换。