Breeze Web API具有非常简单的每个层次结构表继承结构

时间:2013-05-20 07:56:16

标签: c# entity-framework breeze

这篇文章(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\"
            }
        }
    }
}"

1 个答案:

答案 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控制台日志,确保所有内容都已更换