breeze BeforeSaveEntity不保存计算值

breeze BeforeSaveEntity不保存计算值,breeze,Breeze,当一个特定的实体被更新时,我需要在服务器端计算一些值。 如果我更新实体,则会执行以下代码(设置C_CompletePrice),甚至会在clientside上反映出来(clientside breeze会很好地恢复所有属性) 但是当我检查数据库时,没有保存任何内容。因此,当清除浏览器缓存并再次检查实体时,会出现旧值 private bool BeforeSaveTransaction(tblTransactions transaction, EntityInfo info) {

当一个特定的实体被更新时,我需要在服务器端计算一些值。 如果我更新实体,则会执行以下代码(设置C_CompletePrice),甚至会在clientside上反映出来(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);
        }
        ...
我用的是微风1.4.6

在服务器上,我使用的是Breeze.WebApi和Breeze.WebApi.EF

我正在使用的模型:

更新

    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(字典保存映射)
{
foreach(在saveMap.Keys中键入entityType)
{
if(entityType.Name==“TBLTTransactions”)
{
foreach(保存映射[entityType]中的EntityInfo ei)
{
计算交易(ei);
}
}
}
返回base.BeforeSaveEntities(saveMap);
}
私有void CalculateTransaction(EntityInfo EntityInfo)
{
tblTransactions事务=(tblTransactions)entityInfo.Entity;
transaction.C_CompletePrice=1234567;
...
在保存实体之前使用
会导致相同的奇怪行为:

  • 客户端上的实体获取更新集:)

  • DB非:(


因此,在我使用now@dominictus solution(覆盖SaveAll)之前,我想问一下我使用过的那些方法(bool BeforeSaveEntity(…)和BeforeSaveEntity(saveMap))的目的是什么。我咨询了医生,看过bryan noyes brilliant pluralsight课程,但我的头脑仍然不明白:)

我做的有点不同。下面是一个例子,当对象被更改时,我保存一个时间戳。这是我上下文类中的一个方法

    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文档中的示例。

您是否更新了
EntityInfo.OriginalValuesMap
,如?

所述,再次感谢:)我尝试了BeforeSaveEntities(请参阅我的更新)但是没有成功。为了达到这个目的,我将考虑做一个非常常见的任务;(如果它有效)我编辑了我的回复(添加返回语句)。因此,您可以看到,我并没有真正覆盖SaveChanges,只是添加了一些在实体真正保存之前发生的事情。在我看来,这似乎不是一个解决方法。您能检查一下您的saveMap是否真的发生了更改吗?(放置一个断点)谢谢,我也没有想到使用linq来查询状态。所以我给出了我的多余分数,即使我选择了wards答案,我也可以为您的解决方案提供这些分数。您好@Dominictus,您的想法非常好。但是您是否愿意告诉我,我如何重写SaveChanges()方法。我没有找到SaveChanges()的任何重写方法。请给我一个完整的例子。谢谢。嗨@Shohel,你可以覆盖你的上下文类中的SaveChanges
公共类MyContextClass:DbContext
嗨,沃德,嗯,看起来我应该只是rtgm(g代表伟大)更好一点:)它成功了!不要自责。我在阅读了你的问题并意识到我们需要讨论这个技巧后写下了这一点。你让文档变得更好了。Thxi如果这是你需要的答案,请你将它标记为正确答案,以便其他人更容易找到它。