【问题标题】:breeze BeforeSaveEntity does not save calculated value微风 BeforeSaveEntity 不保存计算值
【发布时间】:2013-12-10 03:02:31
【问题描述】:

当特定实体更新时,我需要在服务器端计算一些值。 如果我更新实体,则执行以下代码(设置 C_CompletePrice),它甚至反映在客户端(客户端微风很好地恢复了所有属性) 但是当我检查数据库时,什么都没有保存。所以当清除浏览器缓存并再次检查实体时,会有旧值......

    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 的服务器上

我正在使用的模型: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 会导致同样的奇怪行为:

  • 客户端上的实体得到更新 :)

  • 数据库不是 :(

所以在我现在使用@dominictus 解决方案(覆盖 SaveAll)之前,我恳请您了解我使用过的那些方法的目的bool BeforeSaveEntity(...)和 BeforeSaveEntities(saveMap))。我咨询过医生,也看过 bryan noyes 精彩的复数视力课程,但我的头脑仍然很简单:)

【问题讨论】:

    标签: breeze


    【解决方案1】:

    您是否按照ContextProvider topic 中的说明更新了EntityInfo.OriginalValuesMap

    【讨论】:

    • 嗨,病房,嗯,看起来我应该 rtgm(g 代表伟大)更好一点:) 它奏效了!
    • 不要自责。在阅读您的问题并意识到我们需要讨论这种技术之后,我写了那一点。您使文档变得更好。谢谢
    • 如果这是您需要的答案,请您将其标记为正确答案,以便其他人更容易找到。
    【解决方案2】:

    我做的有点不同。这是一个示例,我在更改对象时保存时间戳。这是我的 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。查看微风文档以获取示例。

    【讨论】:

    • 再次感谢 :) 我尝试过使用 BeforeSaveEntities(请参阅我的更新),但没有成功。为此目的覆盖 SaveChanges 我会考虑作为一个非常常见的任务的解决方法;)(如果它有效)
    • 我编辑了我的响应(添加了 return 语句),因此您可以看到我并没有真正覆盖 SaveChanges,只是添加了在实体真正被保存之前发生的事情。在我看来,这似乎不是一种解决方法。你能检查一下你的 saveMap 是否真的改变了? (下断点)
    • 谢谢,没想到也使用 linq 来查询状态。所以我给出了我可以给你的解决方案的备用积分,即使我会选择病房的答案。
    • 嗨@Dominictus,你的想法非常好。但是你想告诉我,我怎样才能覆盖 SaveChanges() 方法。我没有找到 SaveChanges() 的任何覆盖方法。请给我完整的例子。谢谢。
    • 嗨@Shohel,您可以在上下文类public Class MyContextClass : DbContext中覆盖SaveChanges
    猜你喜欢
    • 1970-01-01
    • 2013-09-14
    • 2013-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-14
    • 1970-01-01
    相关资源
    最近更新 更多