2

这篇文章 ( https://stackoverflow.com/a/14486260/894358 ) 表明 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;

        }
    }
}   

这是从 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\"
            }
        }
    }
}"
4

1 回答 1

2

我无法重现您的示例的问题。事实上,它就像一个魅力。

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

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

\"key\":{\"propertyRef\":{\"name\":\"Id\"}},

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

{"schema":{"namespace":"Inher ...
  “实体类型”:[{“名称”:“车辆”,
     “抽象”:“真实”,
     "key":{"propertyRef":{"name":"Id"}}, ...
}]}]}}}

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

于 2013-05-20T19:01:15.623 回答