1

今天刚开始试用 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 字段,其中一个也有一个对 Product 的 FK。这只是实现 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();
    }

然后我将它加载到微风.js 中:

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

卡布拉莫。例外。它说:

无法获取属性“propertyRef”的值:对象为空或未定义

在:

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 模型中有很多继承必须保留。如果是继承或微风,微风正在得到斧头。

4

2 回答 2

2

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

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

于 2013-03-23T07:27:12.577 回答
0

我不认为 manager.fetchEntityByKey 与继承一起工作——任何 Breeze 家伙都可以确认这是否正确吗?它似乎是从我的基类中获取继承的字段,而不是从我的派生类中获取的字段。我可以使用 entityQuery 获取完整的对象,但是我必须命名每个字段。当我这样做时,我仍然在 ko 绑定上遇到解析错误。

于 2013-05-06T03:06:50.730 回答