我需要在特定实体更新时在服务器端计算一些值。 如果我更新实体,则执行以下代码(C_CompletePrice得到设置),它甚至会反映在客户端上(clientside breeze可以很好地获取所有属性) 但是当我检查数据库时没有保存任何内容。因此,当清除浏览器缓存并再次检查实体时,会有旧值......
private bool BeforeSaveTransaction(tblTransactions transaction, EntityInfo info)
{
transaction.C_CompletePrice = 11111111;
return true;
...
protected override bool BeforeSaveEntity(EntityInfo entityInfo)
{
var entity = entityInfo.Entity;
if (entity is tblTransactions)
{
return BeforeSaveTransaction(entity as tblTransactions, entityInfo);
}
...
我正在使用breeze 1.4.6
服务器上的我正在使用Breeze.WebApi和Breeze.WebApi.EF
我正在使用的模型:http://pastebin.com/Dc03DrNe
更新
protected override Dictionary<Type, List<EntityInfo>> BeforeSaveEntities(Dictionary<Type, List<EntityInfo>> saveMap)
{
foreach (Type entityType in saveMap.Keys)
{
if (entityType.Name == "tblTransactions")
{
foreach (EntityInfo ei in saveMap[entityType])
{
CalculateTransaction(ei);
}
}
}
return base.BeforeSaveEntities(saveMap);
}
private void CalculateTransaction(EntityInfo entityInfo)
{
tblTransactions transaction = (tblTransactions) entityInfo.Entity;
transaction.C_CompletePrice = 1234567;
...
使用BeforeSaveEntities
会导致同样的奇怪行为:
客户端上的实体获取更新:)
DB不:(
所以在我现在使用@dominictus解决方案(覆盖SaveAll)之前,我正在请求我使用的那些方法的目的( bool BeforeSaveEntity(...)和BeforeSaveEntities(saveMap))。我已经咨询过该文档,我已经看过bryan noyes辉煌的复数视频课程,但我的简单思维仍然没有得到它:)
答案 0 :(得分:1)
您是否按照ContextProvider
topic?
EntityInfo.OriginalValuesMap
答案 1 :(得分:0)
我做的有点不同。这是一个我更改对象时保存时间戳的示例。这是我的Context类中的一个方法。
public override int SaveChanges()
{
foreach (
var entry in
this.ChangeTracker.Entries()
.Where((e => (e.State == (EntityState) Breeze.WebApi.EntityState.Added || e.State == (EntityState) Breeze.WebApi.EntityState.Modified))))
{
if (entry.Entity.GetType() == typeof(MyClass))
{
var entity = entry.Entity as MyClass;
if (entity != null) entity.UpdatedDateTime = DateTime.Now;
}
}
return base.SaveChanges();
}
在您的情况下,您可以写下:entity.C_CompletePrice = 11111111;
对于方法BeforeSaveEntity
,我更喜欢使用BeforeSaveEntities
。查看breeze文档以获取示例。