微风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'"
            }
        }
    }
}"

微风Web API与非常简单的表每层次继承结构

我无法重现您的示例中的问题。事实上,它很有魅力。

我几乎一字不差地把它复制到DocCode示例中,因为它太简单了,在进入BillingDetails示例的复杂性之前,我们需要一个简单的示例(将发布下一个版本)。

这是一个带有抽象基类的标准TPH模型。键在元数据中被识别;查看这一行的Vehicle基类:

<>之前'"关键' ":{'"propertyRef '":{'"'":' " Id ' "}},之前

奇怪的是你接收的元数据是旧的字符串格式。当我在测试运行中查看元数据的有效负载时,我得到一个JSON对象:

<>之前{"模式":{"名称":"她……"entityType":[{"名称":"汽车","摘要":"真正的","关键":{"propertyRef":{"名称":" Id "}},…}}]}}}之前

我怀疑你有Breeze.WebApi.dll的旧副本。也许您更新了Breeze NuGet包,旧的程序集被困在引用中,或者保留了旧的脚本文件。尝试卸载和重新安装Breeze。仔细查看NuGet控制台日志,确保所有内容都已替换