(更新为ember-data API Rev 11 ...)
使用按需加载关联的正确方法是什么?特别是,一旦你加载子记录,你如何处理从服务器重新加载父记录清空hasMany数组的事实?我不希望(也许不能)包括的子记录的ID在父的数组.还是有其他方法可以做到这一点,我错过了?DS.Adapter.findAssociation(...)DS.Adapter.findHasMany(...)hasMany
作为旁注,我很困惑应该在关键链接的hasMany/ belongsTo定义中传递哪些选项(如果我没有侧载数据或ID数组,我应该使用映射吗?),所以如果你认为我的问题可以在我的协会定义中,你很有可能是对的.
我正在编写自己的子类,DS.RESTAdapter将ember-data绑定到ASP.NET WebAPI后端(使用Entity Framework).到目前为止一切都那么好,但我有一段时间让协会正常工作.
类似这样的海报,我注意到烬数据的头版说 使用地说,如果你有一个hasMany在你的模型关联,你get该财产,商店会发出为孩子记录的请求.从页面引用:
如果您要请求个人资料,请执行以下操作:
Run Code Online (Sandbox Code Playgroud)author.get('profile');... REST适配器会向URL/profiles发送请求吗?author_id = 1.
这意味着如果你没有侧载并且不包含一组id,会发生这种情况.我意识到这些文档有点过时了,但是我无法在API版本7或更新的版本9中实现这一点.但是在版本9中我确实找到了在版本11中有findAssociation方法,findHasMany方法,我猜是可能已经用来实现这一点,我现在正在尝试使用它.
我不想做的三个主要原因(可能不能):
使用ASP.NET WebAPI如何做这些事情并不明显,至少不是我使用的基于装饰的简单方法.而且,我现在非常喜欢后端的简单性和轻薄性,使用EF和WebAPI它几乎完全是每个实体的样板,我已经完成了!我甚至可以"免费"获得OData过滤支持.
我的子记录通常会通过昂贵的查询生成(例如聚合...指标汇总).并且单个父实体有许多不同类的子实体.因此,即使为所有子类型获取ID 也会很昂贵,并且生成和侧载所有子记录都是不可能的.
我有子实体,主键是复合键.我还没有看到这样的例子甚至在ember-data中得到支持/可能,至少不是用于处理关联(例如,你将如何做一组id?).我在我的客户端模型中创建了一个计算属性,它将复合键强制转换为单个字符串,因此我可以使用从存储中检索单个记录find(...),但是我再也不知道它如何与关联一起工作.
findAssociationfindHasMany我已经发现在API版本9(和一些早期版本但不是全部?) 11中,我可以实现该方法来检索关联的子记录.这大部分都有效,但需要一些体操.这是我的通用方法:DS.Adapter.findAssociationDS.Adapter.findHasManyhasManyfindAssociationfindHasMany
findHasMany: function (store, record, relationship, ids) {
var adapter = this; …Run Code Online (Sandbox Code Playgroud) 所以我将我的AppIcons和LaunchImages迁移到Images.xcassets,看起来效果很好.但是我对启动图像做了一些修改,现在我去提交更改(我使用的是本地唯一的git repo),而且似乎不允许Images.xcassets提交给源代码控制?右键单击它,所有源控件选项都显示为灰色.它并没有出现在Xcode 5的新"全局"提交对话框中.
似乎很荒谬,不允许资产文件被提交,我错过了什么?
请注意,此问题适用于Ember Data pre-1.0 beta,通过URL加载关系的机制在1.0 beta之后发生了显着变化!
我回过头问了一个更长的问题,但自从那时候图书馆发生了变化,我会问一个更简单的版本:
你怎么用的DS.Adapter.findHasMany?我正在构建一个适配器,我希望能够加载get关系属性的关系内容,这看起来像是这样做的方式.但是,看看Ember数据代码,我看不出如何调用这个函数(如果需要,我可以在评论中解释).
我的后端没有一种简单的方法可以在我发送的JSON中的属性键中包含一个id数组 - 我正在使用的序列化器不允许我在任何好的地方挂钩以改变它,它也将是计算上很昂贵.
曾几何时,Ember Data首页显示了这个"延迟加载"的例子......这是可能的,还是路径图中列出的"处理部分加载的记录",还不能完成.?
我是1月15日的API修订版11,主分支.
好的,以下几乎是有效的.首先,我findHasMany根据测试用例的实现在我的适配器中创建了以下方法:
findHasMany: function(store, record, relationship, details) {
var type = relationship.type;
var root = this.rootForType(type);
var url = (typeof(details) == 'string' || details instanceof String) ? details : this.buildURL(root);
this.ajax(url, "GET", {
success: function(json) {
var serializer = this.get('serializer');
var pluralRoot = serializer.pluralize(root);
var hashes = json[pluralRoot]; //FIXME: Should call some serializer method to get this?
store.loadMany(type, …Run Code Online (Sandbox Code Playgroud) 我有一个SSIS包 - 两个数据流任务,每个8个组件,从两个平面文件读取,没什么了不起的.如果我在BIDS中运行它,它需要可靠的大约60秒.我有一个沙箱数据库服务器,其中包在一个作业中运行,也可以在30-60秒内可靠运行.在我的生产服务器上,使用相同程序包的相同作业需要30秒到12小时.
在程序包上启用日志记录后,它似乎在一个或另一个(或两个)数据流任务的预执行阶段陷入困境 - 最初至少.但是我也可以看到数据进入 - 慢慢地,以块为单位,所以我认为它确实会从那里开始.IO子系统受到攻击,SSIS生成许多大型临时文件(大约150MB - 我的输入数据文件只有大约24MB放在一起)并且正在从这些文件中进行大量读写(捶打?).
值得注意的是,如果我在生产服务器上指向包的BIDS实例,它仍然只需要大约60秒就可以运行!所以必须在那里运行dtexec,而不是DB本身.
我已经尝试优化我的包,减少输入行字节大小,并且我使两个数据流任务串行而不是并行运行 - 无济于事.
两个数据库服务器都运行MSSQL 2008 R2 64位,相同的补丁级别.两台服务器都是同一主机上的虚拟机,具有相同的资源分配.生产服务器上的负载不应该比沙盒服务器上的负载高得多.我能看到的唯一区别是生产服务器运行的是Windows Server 2008,而沙箱则位于Windows Server 2008 R2上.
救命!!!任何想尝试的想法都是受欢迎的,可能导致这种巨大差异的原因是什么?
这是我的包裹的样子......
控制流程非常简单:

数据流如下所示:

第二个数据流任务完全相同,只是使用不同的源文件和目标表.
控制流中的完成约束只是使任务串行运行以尝试并同时减少所需的资源(而不是它有助于解决问题)......两个任务之间没有实际的依赖关系.
我知道阻塞和部分阻塞转换的潜在问题(不能说我完全理解它们,但至少有些),我知道聚合和合并连接是阻塞的,可能会导致问题.然而,再一次,除了生产服务器之外,这一切都在其他所有环境中运行良好且快速...所以给出了什么?
合并连接的原因是使任务等待多播的两个分支完成.右分支在输入中找到最小日期时间并在该日期之后删除表中的所有记录,而左分支携带新的输入记录以进行插入 - 因此如果右分支在聚合和删除之前进行,则新记录将被删除(发生这种情况).我不知道有更好的方法来管理它.
"删除记录"中的错误输出始终为空 - 这是故意的,因为我实际上并不希望合并中来自该分支的任何行(合并仅用于同步完成,如上所述).
请参阅下面有关警告图标的评论.
sql-server ssis sql-server-2008 windows-server-2008 windows-server-2008-r2
自从@解决了我遇到的问题以来,此时纯粹是好奇心,但为什么Name特别?
我有一个EF实体属性叫Name...如果我不把它@放在前面Name,我没有得到任何类型的错误,但Name对象的属性没有被分配.如果我放入@Name对象初始化程序,它会Name正确分配:
a = new Author
{
Id = Guid.NewGuid().ToString(),
@Name = "Jason Hater" // Apparently "Name" is quasi-reserved or something...?!?
};
Run Code Online (Sandbox Code Playgroud)
我检查了生成的代码,它只是命名为Name:
[EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
[DataMemberAttribute()]
public global::System.String Name
{
get
{
return _Name;
}
//...
}
Run Code Online (Sandbox Code Playgroud)
所以,Name没有列为关键字,为什么它特别?
好吧,正如@sergey建议的那样,它肯定比我想象的要复杂一点.特别是关于实体框架的蠢事.
这在单元测试类中表现出来,也可能是相关的.我不确定什么是相关的,什么不是现在不幸的,所以这是整个[TestInitialize]方法,在它的底部你可以看到奇怪的事情发生在context.SaveChanges():
[TestClass]
public class EntityConverterTests
{
private Author a;
private Post p, p2, p3; …Run Code Online (Sandbox Code Playgroud) 有许多问题以这样或那样的方式提出:"在呈现视图的某些部分之后我该怎么做?" (这里,这里,这里只是为了给几个).答案通常是:
didInsertElement在最初呈现视图时运行代码.Ember.run.next(...)运行代码,如果需要访问创建的DOM元素.isLoaded后,使用观察者或类似属性执行某些操作.令人恼火的是,这导致了一些非常笨拙的样子:
didInsertElement: function(){
content.on('didLoad', function(){
Ember.run.next(function(){
// now finally do my stuff
});
});
}
Run Code Online (Sandbox Code Playgroud)
当你使用ember-data时,这实际上并不一定有用,因为isLoaded可能已经是真的(如果记录之前已经加载过,并且不再从服务器请求).因此,正确排序是很困难的.
最重要的是,您可能已经在视图模板中观看isLoaded,如下所示:
{{#if content.isLoaded}}
<input type="text" id="myTypeahead" data-provide="typeahead">
{{else}}
<div>Loading data...</div>
{{/if}}
Run Code Online (Sandbox Code Playgroud)
并在您的控制器中再次执行它似乎是重复.
我提出了一个有点新颖的解决方案,但它要么需要工作,要么实际上是一个坏主意......任何一种情况都可能是真的:
我写了一个小的Handlebars帮助器{{fire}},当执行包含的把手模板时会触发一个带有自定义名称的事件(即应该每次重新渲染子视图时,对吗?).
这是我很早期的尝试:
Ember.Handlebars.registerHelper('fire', function (evtName, options) {
if (typeof this[evtName] == 'function') {
var context = this;
Ember.run.next(function () {
context[evtName].apply(context, options); …Run Code Online (Sandbox Code Playgroud) 我已经看过这个问题了很多次,但是没有看到一个很好的例子,当参数化查询真的不是一个选项时...但我认为我有一个.
我正在使用Cisco Call Manager AXL API.它的后端是一个Informix DB.通常,只要有可能,我使用提供的SOAP方法来获取结果,因为我使用WSDL创建的接口类并在实际对象属性中传递参数,因此它负责通过SOAP库进行必要的转义.
然而:
我必须对数据库使用直接SQL调用,并且API提供了一种方法,您可以传入SQL查询(作为字符串)并获取结果行.不幸的是,这种方法不能为参数化查询提供任何便利.所以,是的,我实际上需要自己逃避.
那么,当然我可以制作自己的正则表达式,但是A:我很容易错过一些东西,而且B:真的吗?这没有实用工具类?我可以以某种方式使用SQL参数化引擎来吐出转义的查询吗?显然我知道你必须处理',但我已经阅读了关于退格字符注入方法,我确信还有其他我还不知道的......当然其他人已经编写了一个非常安全的版本?
范围:
我正在编写一个 PPT 插件,它可以制作幻灯片的 PNG 并将其上传到某个地方。我希望幻灯片创建者能够在文本框中添加日期/时间(使用插入 > 日期和时间),并使这些日期/时间反映拍摄快照的时间。
如果在添加时选中“自动更新”,则时间戳仅在幻灯片打开时更新。有没有办法找到所有形状的所有日期/时间标签/字段并强制它们在我拍摄快照之前立即更新?
我发现可能做我想做的唯一另一种方法是在幻灯片上有“命名”形状,这些形状是空的,并以编程方式将日期填充到它们中……但这会给构建幻灯片的人带来额外的复杂性,并且是一般比较乱。但如果有的话,我对其他可能性持开放态度。
谢谢!
-编辑-
好的,我刚刚意识到当我使用 SaveGraphic 创建 PNG 时,PNG 中的时间戳会更新!所以这可能就是我绝对需要的。有趣的是,用户在屏幕上查看的日期戳不会更新,这可能会使用户感到困惑。所以问题仍然存在......似乎这应该是可行的。
我有一个返回 的 MVC4 WebAPI 控制器IQueryable,因此我可以$filter在 URL 中使用 和 朋友来操作来自 REST 端点的结果。这是我的控制器:
public class EnrollmentController : ApiController
{
[Queryable]
public IQueryable<tblEnrollment> Get()
{
var context = new ProjectEntities();
context.ContextOptions.LazyLoadingEnabled = false;
return context.tblEnrollment.AsQueryable();
}
}
Run Code Online (Sandbox Code Playgroud)
但是,就像这张海报一样,我想让 JSON 输出格式有点不同,以便与 Ember Data 的预期格式更加友好。所以我想返回这个:
return new { enrollment = context.tblEnrollment.AsQueryable() };
Run Code Online (Sandbox Code Playgroud)
但是,这会破坏 OData 功能,因为我没有将其返回IQueryable到 WebAPI 层。所以,我想知道是否有办法做这样的事情:
return new { enrollment = context.tblEnrollment.AsQueryable().ApplyOData() };
Run Code Online (Sandbox Code Playgroud)
我确信这是真的……但是有没有某种方法可以显式处理 OData 参数,而IQueryable不是让 WebAPI 层在从Get方法返回的结果集上隐式处理?或者还有其他方法可以完成我在这里想要的事情吗?
顺便说一句,我暂时停留在 EF4 上,因为我无法升级到 VS2012(因此无法升级到 …
asp.net entity-framework-4 odata asp.net-mvc-4 asp.net-web-api