我使用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);
}
}
让我感到惊讶的是,您在依赖的Foo
实体中没有外键(FK)属性。
您已经通过映射中的t.MapKey
表达式在数据库表(“Foo.BarId”)中标识了FK列。
HasRequired(t => t.Bar).WithMany().Map(t => t.MapKey("BarId"));
但是您故意没有在Foo
实体中创建相应的BarId
FK属性。
实体框架可以检索缺少FK属性的关联的对象图。因为您向Entity Framework介绍了FK列,所以它可以在服务器上具体化Foo
及其Bar
。这就是为什么您会在导线上看到相关的条
数据。
但是BreezeJS无法访问数据库。。。它也不应该有任何数据库意识。Breeze只知道(通过元数据)您的实体类型属性。如果没有FK属性,Breeze无法将条
与其父项Foo
关联。
BreezeJS可能能够在缓存中实现Bar
实体。我敢打赌(没有promise),如果你打破了成功的回调,并在控制台中执行以下操作,你会发现它:
manager.getEntities('Bar');
但对Breezjs来说,这只是缓存中的另一个实体。Breeze无法填充Foo.Bar
导航属性,因为它不知道Foo
和Bar
之间的关系。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,最好
问题内容: 我想限制导航属性返回的模型。例如,我正在使用模型来记录模型的活动。删除模型后,将设置和属性。但是,由于从未真正从数据库中“删除”任何内容,因此这些模型仍将填充在其他模型引用的导航属性中。 AuditInfo类 具有导航属性的类 正在审核的课程 我将如何设置约束,以使BlogPost.Comments中仅未删除的注释(Comment.AuditInfo.Deleted为NULL)? 问题
实际上,我正在我的应用程序中使用新的架构组件,并且我已经设置了导航组件。我有一个导航抽屉,我想用它。我已经设置好了,但我面临一些问题: 1-抽屉不会自动关闭。菜单正常工作并导航到正确的位置,但导航后不会关闭。我必须添加一个目的地ChangedListener才能自己关闭它。 在代码实验室里,抽屉自动关闭,我真的不明白为什么。 2-向上按钮打开抽屉。当我导航到非顶级片段时,菜单图标变为向上箭头,但当
问题内容: 抱歉,如果还有其他地方,我发现了很多类似的示例,但无法将其用于我的数据。2天后,我需要一个答案:( 基本上有一个SQL Server表,其中的列包含XML数据。此数据包含我需要提取的值。 这是我的XML。 我需要能够提取与字段名称关联的值。 因此,从本质上讲,我想浏览XML以找到具有的节点并返回或等效值。 下面是我自己编写的代码,这些代码提取了值,但是问题是XML有时以不同的顺序排列,