- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用这个:
https://genericunitofworkandrepositories.codeplex.com/
以及以下博客文章集:
http://blog.longle.net/2013/05/11/genericizing-the-unit-of-work-pattern-repository-pattern-with-entity-framework-in-mvc/
我们正在尝试将这些存储库与Breeze
一起使用,因为它可以很好地处理客户端javascript和OData。
我想知道我们如何在Breeze
中使用它们来正确地覆盖BeforeSaveEntity
。
在保存期间,我们有很多业务逻辑需要进行(修改诸如ModifiedBy
,ModifiedTime
,CreatedBy
之类的属性),但是当我们更改这些逻辑时,它们不会被轻而易举地更新,因此我们必须保存后重新查询(我们尝试手动将更改映射回去,但这需要我们重复所有业务逻辑)。
我们的第二个选择是检查每个entity
的类型,然后为其请求正确的存储库,在内部处理保存,然后在客户端上执行新的get请求以获取更新的信息。虽然这很有趣,所以我们希望有更好的方法。在绕过微风的保存而又不返回错误或不必随后获取数据的情况下更新这些对象的正确方法是什么?
保存过程中带有Business Logic的Breeze的任何示例都将非常有帮助,特别是如果它发生在服务,存储库或直接在BeforeSaveEntity
方法中的其他事件中。
最佳答案
这是许多问题汇总成一个问题,每个问题都是一个大话题。我能做的最好的就是将您指向某些方向。
在开始介绍之前,让我解释一下为什么您看不到设置“ ModifiedBy
,ModifiedTime
,CreatedBy
等属性)的效果。 EFContextProvider
不会更新已修改实体的每个属性,而是仅更新EntityInfo.OriginalValuesMap
中提到的那些属性,即属性名称和仅已更改属性的原始值的词典。如果要保存仅在服务器上设置的属性,只需将其添加到原始值映射即可:
var map = EntityInfo.OriginalValuesMap;
map["ModifiedBy"]=null; // the original value does not matter
map["ModifiedTime"]=null;
EFContextProvider
。该控制器(或多个控制器)将委派给负责业务逻辑和数据访问的外部类,也许是存储库或工作单元(UoW)类。
BeforeSaveEntities
扩展点中找到应用自定义业务逻辑的有价值的线索。以及基于发出请求的用户的那些类型的某些记录。
IQueryable
)连接到返回
IQueryable
(或只是对象)的存储库方法是很简单的。 Web API不必知道您是否在后台有Breeze
EFContextProvider
或完全不同的东西。
SaveChanges
请求有点棘手。也许您可以从
ContextProvider
或
EFContextProvider
派生;也许不吧。
Study the "ContextProvider.cs" documentation和
source code,尤其是
SaveChanges
方法,您将看到需要做些什么来使Breeze客户端满意并与之交互,但是您想使用UoW处理变更集保存。
SaveChanges
只需要做两件事:
SaveResult
的内容
saveBundle
是一个JSON包,您可能不想解压缩自己。幸运的是,您可以从
ContextProvider
派生一个类,该类仅用于将
saveBundle
转换为“ SaveMap”,即
EntityInfo
对象的字典,几乎是任何人在分析变更集时都想使用的对象用于验证和保存。
using System;
using System.Collections.Generic;
using System.Data;
using Breeze.ContextProvider;
using Newtonsoft.Json.Linq;
public class SaveBundleToSaveMap : ContextProvider
{
// Never create a public instance
private SaveBundleToSaveMap(){}
/// <summary>
/// Convert a saveBundle into a SaveMap
/// </summary>
public static Dictionary<Type, List<EntityInfo>> Convert(JObject saveBundle)
{
var dynSaveBundle = (dynamic) saveBundle;
var entitiesArray = (JArray) dynSaveBundle.entities;
var provider = new SaveBundleToSaveMap();
var saveWorkState = new SaveWorkState(provider, entitiesArray);
return saveWorkState.SaveMap;
}
// override abstract members but DO NOT USE ANY OF THEM
}
SaveResult
是一个简单的结构:
public class SaveResult {
public List<Object> Entities; // each of the entity type you serialize to the client
public List<KeyMapping> KeyMappings;
public List<Object> Errors;
}
public class KeyMapping {
public String EntityTypeName;
public Object TempValue;
public Object RealValue;
}
关于c# - 如何将Breeze与通用工作单元和存储库一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20714180/
我是一名优秀的程序员,十分优秀!