BreezeJs无法为具有继承类的EF Code First Schema加载元数据

时间:2013-03-23 05:20:24

标签: ef-code-first entity-framework-5 breeze table-per-type

今天刚开始尝试Breeze,很久以来EF用户 - 我觉得我在Breeze中发现了一个错误,但我可能做错了什么 - 想知道它是什么:

我在EF Code First中有一个简单的层次结构:

// For testimonials about the product line in general
public class Testimonial
{
    public int Id { get; set; }

    public string Text { get; set; }
}

// For testimonials specific to a single product
[Table("ProductTestimonial")]
public class ProductTestimonial : Testimonial
{
    public Product Product { get; set; }
}

所以要明确这里有2个表,Testimonial和ProductTestimonial,都有一个Id的PK和一个Text字段,其中一个也有一个FK off到Product。这只是实现Table Per Type的一种简单方法。

所以我通过WebApi设置了BreezeController:

[BreezeController]
public class EFController : ApiController
{
    private readonly EFContextProvider<EfDb> _db = new EFContextProvider<EfDb>();

    [HttpGet]
    public string Metadata()
    {
        return _db.Metadata();
    }

然后我在breeze.js中加载它:

var manager = new breeze.EntityManager('/api/ef');
manager.executeQuery(breeze.EntityQuery.from('Product');

Kablamo。例外。它说:

  

无法获取属性'propertyRef'的值:object为null或undefined

目前:

function convertFromODataEntityType(... {
    . . .
    var keyNamesOnServer = toArray(odataEntityType.key.propertyRef)...

odataEntityType.name == 'ProductTestimonial'.key确定不确定的地方。

这是真的。挑选事物,当我调用executeQuery()时,Breeze点击WebApi上的元数据调用,我验证了调用并成功返回。从那里返回的大量JSON字符串包括:

{
    "name": "ProductTestimonial",
    "baseType": "Self.Testimonial",
    "navigationProperty": {
        "name": "Product",
        "relationship": "Self.ProductTestimonial_Product",
        "fromRole": "ProductTestimonial_Product_Source",
        "toRole": "ProductTestimonial_Product_Target"
    }
},
{
    "name": "Testimonial",
    "key": {
        "propertyRef": {
            "name": "Id"
        }
    },

所以看起来基本的问题是元数据准确地将ProductTestimonial描绘为一个继承的类,其键在别处被定义,但是Breeze.js - 如果我正确地理解它 - 只是天真地检查.key属性不考虑超类。但是,我可能错了,因为我对Breeze很新。

附录:

我不认为它在这里是相关的,但如果它出现,是的,我在WebApi控制器上也有一个IQueryable:

[HttpGet]
public IQueryable<Product> Products()
{
    return _db.Context.Products;
}

另外,我认识到这里潜在的解决方法可能是放弃TPT并为每个没有继承的实体制作完整的类,但我真的在这里减肥 - 在EF模型中有很多继承必须留。如果它是继承或Breeze,Breeze就会获得斧头。

2 个答案:

答案 0 :(得分:2)

编辑:从v 1.3.1开始,Breeze现在支持继承。

继承即将到来但我们还没有固定的日期。请在Breeze User Voice上投票赞成该功能。我们非常重视这些建议。

答案 1 :(得分:0)

我认为manager.fetchEntityByKey不适用于继承 - 任何Breeze人都可以确认这是否正确?它似乎是从我的基类中获取继承的字段,而不是从我的派生类中获取字段。我可以通过使用entityQuery来获取完整的对象,但是我必须为每个字段命名。当我这样做时,我仍然在ko绑定上得到解析错误。