当前位置: 首页 > 知识库问答 >
问题:

查询中的导航属性等问题

闻昊英
2023-03-14

我使用Web API 2与CORS/实体框架6/Breeze.js从鲍尔为一个单页应用程序和微风查询不扩展导航属性。

我将把它从服务器分解到客户端。

//POCOs

public class Foo
{
    public int Id { get; set; }
    public Bar Bar { get; set; }
}

public class Bar
{
    public int Id { get; set; }
    public string SomeData { get; set; }
}

public class FooMap : EntityTypeConfiguration<Foo>
{
    public FooMap()
    {
        HasKey(t => t.Id);

        ToTable("Foo");
        Property(t => t.Id).HasColumnName("Id");

        HasRequired(t => t.Bar).WithMany().Map(t => t.MapKey("BarId"));
    }
}

//Web API配置//省略静态类和默认路由//配置为HttpConfiguration

config.EnableCors(new EnableCorsAttribute("*", "*", "*"));

//微风控制器

[BreezeController]
public class FooController : ApiController
{
    readonly EFContextProvider<SomeDbContext> _contextProvider =
        new EFContextProvider<SomeDbContext>();

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

    [HttpGet]
    public IQueryable<Foo> Foos()
    {
        return _contextProvider.Context.Foos;
    }
}

//前端接地

//main.js

breeze.NamingConvention.camelCase.setAsDefault();

var FooService = (function(breeze) {
    var service = "http://localhost:58996/breeze/Foos";
    breeze.config.initializeAdapaterInstances({ dataService: 'webApi' });

    var manager = new breeze.EntityManager(service);
    var entityQuery = new breeze.EntityQuery();

    this.getAll = function(callback, errorCallback) {
        return manager.executeQuery(entityQuery.from('Foo').take(10).expand('Bar'), callback, errorCallback);
    };
})(window.breeze);

var fooService = new FooService();
fooService.getAll(function(data) {
    console.log(data);
}, function(error) {
    console.log(error);
});

Fiddler显示JSON负载:

[
   {
      "$id":"1",
      "$type":"DataAccess.Models.Foo, DataAccess",
      "Id":"10",
      "Bar":{
         "$id":"2",
         "$type":"DataAccess.Models.Bar, DataAccess",
         "Id":"12",
         "SomeData":"Hello World"
      }
   }
]

但是bar不是chrome中数组中对象的字段。

编辑:

解决方案是添加一个属性来保存BarId,并将其设置为外键。

public class Foo
{
    public int Id { get; set; }
    public int BarId { get; set; }
    public Bar Bar { get; set; }
}

public class FooMap : EntityTypeConfiguration<Foo>
{
    public FooMap()
    {
        HasKey(t => t.Id);

        ToTable("Foo");
        Property(t => t.Id).HasColumnName("Id");
        Property(t => t.BarId).HasColumnName("BarId");

        HasRequired(t => t.Bar).WithMany().HasForeignKey(t => t.BarId);
    }
}

共有1个答案

谷泽宇
2023-03-14

让我感到惊讶的是,您在依赖的Foo实体中没有外键(FK)属性。

您已经通过映射中的t.MapKey表达式在数据库表(“Foo.BarId”)中标识了FK列。

HasRequired(t => t.Bar).WithMany().Map(t => t.MapKey("BarId"));

但是您故意没有在Foo实体中创建相应的BarIdFK属性。

实体框架可以检索缺少FK属性的关联的对象图。因为您向Entity Framework介绍了FK列,所以它可以在服务器上具体化Foo及其Bar。这就是为什么您会在导线上看到相关的数据。

但是BreezeJS无法访问数据库。。。它也不应该有任何数据库意识。Breeze只知道(通过元数据)您的实体类型属性。如果没有FK属性,Breeze无法将与其父项Foo关联。

BreezeJS可能能够在缓存中实现Bar实体。我敢打赌(没有promise),如果你打破了成功的回调,并在控制台中执行以下操作,你会发现它:

manager.getEntities('Bar');

但对Breezjs来说,这只是缓存中的另一个实体。Breeze无法填充Foo.Bar导航属性,因为它不知道FooBar之间的关系。Breeze需要FK属性来实现Foo.Bar导航属性。

这就是为什么我们说“BreezeJS关联必须由FK属性支持”

与缺乏FK属性的关联一起工作需要相当多的技能和知识(超出本答案的范围)。您必须使用自己的代码维护导航属性;微风是做不到的。我的建议(包括我自己):不要去那里。

如果您将“Foo.cs”重新定义为

public class Foo
{
    public int Id { get; set; }
    public int BarId { get; set; } // Bar nav's FK
    public Bar Bar { get; set; }
}

顺便说一句,如果有人想知道,CORS不是这个问题的一个因素。

 类似资料:
  • (尤其是@JeenBroekstra) 使用下面的图表,我得到了这个SPARQL查询,它目前在芝麻存储库中工作: 由于最后两个可选模式共享一些过滤器,我想我可以合并它们,我导致了这个查询: 但是当执行它时,我会得到一个空的结果集。 在提交bug请求之前,我想问一下:你能告诉我这个查询哪里错了吗?或者这是芝麻中的bug吗? 提前谢谢你,麦克斯。 编辑:我当然把FILTER(绑定(?newSupC))

  • OData服务(V2)包含以下多个导航属性: 如上所示,和是导航属性 请求OData服务的代码: 如何通过代码从导航属性中获取URL?我可以通过以下对象获取它: 但我不知道这是不是正确的方式。

  • 问题内容: 您将如何证明两个查询在功能上是等效的,例如它们将始终都返回相同的结果集。 由于在执行此操作时会想到一个特定的查询,因此最终按照@dougman的建议进行操作,在有关表的约10%的行中进行比较并比较结果,以确保没有不合适的结果。 问题答案: 最好的办法是根据给定的一组输入比较两个查询输出,以查找任何差异。要说它们对于所有输入将始终返回相同的结果,实际上取决于数据。 对于Oracle,最好

  • 实际上,我正在我的应用程序中使用新的架构组件,并且我已经设置了导航组件。我有一个导航抽屉,我想用它。我已经设置好了,但我面临一些问题: 1-抽屉不会自动关闭。菜单正常工作并导航到正确的位置,但导航后不会关闭。我必须添加一个目的地ChangedListener才能自己关闭它。 在代码实验室里,抽屉自动关闭,我真的不明白为什么。 2-向上按钮打开抽屉。当我导航到非顶级片段时,菜单图标变为向上箭头,但当

  • 问题内容: 我想限制导航属性返回的模型。例如,我正在使用模型来记录模型的活动。删除模型后,将设置和属性。但是,由于从未真正从数据库中“删除”任何内容,因此这些模型仍将填充在其他模型引用的导航属性中。 AuditInfo类 具有导航属性的类 正在审核的课程 我将如何设置约束,以使BlogPost.Comments中仅未删除的注释(Comment.AuditInfo.Deleted为NULL)? 问题

  • 问题内容: 抱歉,如果还有其他地方,我发现了很多类似的示例,但无法将其用于我的数据。2天后,我需要一个答案:( 基本上有一个SQL Server表,其中的列包含XML数据。此数据包含我需要提取的值。 这是我的XML。 我需要能够提取与字段名称关联的值。 因此,从本质上讲,我想浏览XML以找到具有的节点并返回或等效值。 下面是我自己编写的代码,这些代码提取了值,但是问题是XML有时以不同的顺序排列,