Breeze不会用其真实数据替换Ref:节点

Breeze does not replace the Ref: node with its real data

本文关键字:替换 Ref 节点 数据 真实 Breeze      更新时间:2023-09-26

如何强制微风加载真实的Node数据,而不是像Object {$ref: "5"}这样的数据?除了我在客户端代码中创建的一个扩展属性外,这种情况一直都在发生。

原始JSON包含以下部分:

CurrentUserAssignments: [
{
$ref: "5"
}
],

其从未被引用到也包括在原始JSON结果中的节点5。

这是我的EF实体的一部分:

 public class Task
    {
        public Guid Id {get; set;}
         private  ICollection<Assignment> _assignments;
        public virtual ICollection<Assignment> Assignments
        {
            get { return _assignments ?? (_assignments = new Collection<Assignment>()); }
            set{_assignments = value;}
        }
        [NotMapped]
        public Assignment CurrentUserAssignments
        {
            get
            {
                var userId = Guid.Parse(HttpContext.Current.User.Identity.Name.Split('$'[1]);
               return Assignments.OrderByDescending(a=>a.AssignmentDate).Take(1).SingleOrDefault(p => p.AssigneeId == userId && p.IsRevoked == false && p.Invisible == false);

            }
        }
....
}

在客户端中,我在任务构造函数中注册了CurrentUserAssignments类似于:

store.registerEntityTypeCtor(models.entityNames.task, function () { this.NoteCount = 0; this.IsDone = false; this.CurrentUserAssignments = ko.observable() });

但是CurrentUserAssignments永远不会被真实数据填满,而只有ref:'5'

为什么用[NotMapped]属性标记"CurrentUserAssignments"?

对于真实数据,您应该在客户端使用.extend或在服务器端使用.Include。当服务器返回$ref时,这意味着对象以前已经发送过,并且它已经被赋予了唯一的标识符。

服务器不需要一次又一次地发送同一个对象,而是知道有一个具有唯一标识符的对象,然后可以只发送$ref而不是实际对象。Breeze能够对此进行解析,并可以用以前发送过的真实对象替换$ref。

你唯一需要做的就是让breeze在客户端或服务器端使用.expand或.include将该对象包含到"主"对象中。

您可以在这里阅读有关$ref的一些详细信息:http://breeze.github.io/doc-cs/webservice-data-mapping.html

只需搜索$ref,下面有描述。