【问题标题】:BreezeJs Fails to Load Metadata for EF Code First Schema with Inherited ClassBreezeJs 无法为具有继承类的 EF Code First Schema 加载元数据
【发布时间】:2013-03-23 05:20:24
【问题描述】:

今天刚开始试用 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();
    }

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

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

Kablamo. 例外。它说:

无法获取属性“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 模型中有很多继承必须停留。如果是继承或微风,微风正在得到斧头。

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢。也许 Bridge 需要在主页上提供路线图?今天会为我节省大量时间。
    【解决方案2】:

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

    【讨论】:

    • 我已经使用我们的内部测试为具有 TPH 继承的实例测试了 fetchEntityByKey,它似乎工作正常。您能否发布一个小示例,说明作为单独的 Stackoverflow 帖子失败的原因?或发送电子邮件至轻率@ideablade.com(收件人:Jay Traband),并附上一个失败的“小”示例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-27
    相关资源
    最近更新 更多