Breezejs SaveChanges:是否可以以某种方式返回自定义的SaveResult对象?

Breezejs SaveChanges:是否可以以某种方式返回自定义的SaveResult对象?,breeze,Breeze,假设我有一个电影实体,平均分数。用户可以对电影进行评级,为此,我在客户端调用datacontext.savechanges,向服务器发送评级对象。在服务器上,调用SaveChanges方法,在BeforeSaveEntity方法中,我调整电影的平均分数 问题是:如何从服务器的SaveChanges方法(例如在SaveResult对象中)返回平均分数 我想我可以将电影实体添加到SaveResult实体列表中,但是: -我需要从saveBundle参数中访问属性 -我必须重新查询数据库,这是我在sa

假设我有一个电影实体,平均分数。用户可以对电影进行评级,为此,我在客户端调用datacontext.savechanges,向服务器发送评级对象。在服务器上,调用SaveChanges方法,在BeforeSaveEntity方法中,我调整电影的平均分数

问题是:如何从服务器的SaveChanges方法(例如在SaveResult对象中)返回平均分数

我想我可以将电影实体添加到SaveResult实体列表中,但是: -我需要从saveBundle参数中访问属性 -我必须重新查询数据库,这是我在saveEntity之前做的

谢谢


Nicolas

正如pawel在评论中指出的那样:要在SaveChanges承诺中返回电影,请在自定义EFContextProvider上的BeforeSaveEntities方法中更新电影,并将其添加到saveMap中

我给你编了一些代码

protected override Dictionary<Type, List<EntityInfo>> BeforeSaveEntities(Dictionary<Type,   List<EntityInfo>> saveMap) {
    Movie movie = null;
    // initialize the movie variable and update the movie as needed
    saveMap.Add(typeof(Movie), movie);

    return saveMap;
  }
受保护的覆盖字典BeforeSaveEntities(字典保存映射){
Movie=null;
//初始化电影变量并根据需要更新电影
saveMap.Add(类型(电影),电影);
返回saveMap;
}
是的,这是可能的

像往常一样,针对EDMX编写控制器。对我们来说,这可以转化为如下内容:

public class PersonalizationController : MultiTenantBreezeController<PersonalizationEntities>
公共类PersonalizationController:MultiTenantBreezeController
其中PersonalizationEntities是ObjectContext

然后在服务器上,我们只需定义SaveChanges(不要介意重写,我们有一个基类)

[HttpPost]
公共覆盖SaveResult SaveChanges(JObject saveBundle)
{
//反序列化需要保存的对象(ApplicationDefaults是我的DTO)
var applicationDefaultsList=JsonConvert.DeserializeObject(saveBundle.SelectToken(“entities”).ToString();
//执行保存数据所需的任何逻辑
使用(var repo=ServiceLocator.Current.Container.Resolve())
{
//你的保存逻辑在这里
}
//构造保存结果以通知客户端服务器已完成保存操作
var keyMappings=新列表();
返回新的SaveResult()
{
Entities=applicationDefaultsList.Cast().ToList(),
Errors=null,
KeyMappings=KeyMappings
};
}

更新BeforeSaveEntities方法中的分数。请确保将保存score属性的实体包含到保存映射中。是的,我应该可以这样做,但会出现“Sequence contains no matching element”错误。一些代码可以帮助我更好地理解这个问题。不要忘记,您可以覆盖SaveChangesCore,这可能会提供一些调整的机会。在WebAPI返回SaveResult之前,您还有另一个机会(您可以将一个值存储在某个地方,以便在控制器中使用)。最后,SaveResult本身没有什么神圣之处。从客户端的角度来看,它是一种结构类型:任何序列化预期内容的内容都将被BreezeJS EntityManager接受。有很多选择,很有趣!但是,您提到的方法(SaveChangesCore)在文档中找不到。()只在NoDB示例中提到,此后我就没有读过。。我使用DB:)。无论如何,在此期间,我实际上使用了一种变通方法,并将所需的值存储在System.Web.HttpContext.Current.Items中。我使用BeforeSaveEntities选项的问题是:我有2个DBContext,其中一个是暴露于世界的“DTO”上下文。这是创建元数据的基础。该上下文的任何类都不会实际保存在数据库中。一切都被转换并映射到“私有”上下文中。我的理解是,我无法将类的实例从“private”上下文添加到savemap,因为这会产生“Sequence contains no matching element”错误。我也不能在其中添加DTO,因为这些对象没有实际的DB。我不清楚为什么在DTO上下文中没有Movie.Score?你不必将分数保存到数据库-使其只读。你说的“使其只读”是什么意思?我所知道的是,我无法将MovieDTO添加到saveMap,因为它无法保存在DB中,也无法将Movie添加到saveMap,因为它会产生我提到的错误。但是我已经找到了一种方法,可以将我想要的实体添加到saveResult中,所以没问题。
[HttpPost]
public override SaveResult SaveChanges(JObject saveBundle)
{
     // Deserialize the object that needs to get saved (ApplicationDefaults is my DTO)
     var applicationDefaultsList = JsonConvert.DeserializeObject<List<ApplicationDefaults>>(saveBundle.SelectToken("entities").ToString());

     // Do whatever logic you need to save the data
     using (var repo = ServiceLocator.Current.Container.Resolve<IUserPreferenceRepository>())
     {
          // Your save logic here
     }

     // Construct the save result to inform the client that the server has completed the save operation
     var keyMappings = new List<KeyMapping>();
     return new SaveResult()
     {
         Entities = applicationDefaultsList.Cast<object>().ToList(),
         Errors = null,
         KeyMappings = keyMappings
     };
}