【问题标题】:EF 4 can't seem to call SaveChangesEF 4 似乎无法调用 SaveChanges
【发布时间】:2011-04-01 03:01:56
【问题描述】:

我使用以下方法覆盖此上下文:

  public class MyContext : DbContext
  { 
    public DbSet<Contract> Contracts{get;set;}  
    public override int SaveChanges()
    {
        Contract ctr = new Contract
        {
            ContractId = "CT99999991",
            ContractNumber = "9000",
            LastModifiedDate = DateTime.Now,
            GracePeriod = DateTime.Now,
            ShipByDate = DateTime.Now,
            ExpirationDate = DateTime.Now
        };
        this.Contracts.Add(ctr);
        return base.SaveChanges();
    }
  }

无论我如何尝试,我都无法成功地使这部分代码成功。 我很想在 SaveChanges 事件发生时将上层合同保存在数据库中。 有什么我忽略的吗?

【问题讨论】:

  • 是的,你做错了! j/k,您可能想发布错误消息/异常。
  • 嗨 stefan,当我通过更新和保存对象来执行代码时,没有抛出异常。
  • 也许有助于更好地理解为什么要覆盖 SaveChanges() 方法?
  • @BrandonZeider,每当添加或修改合同时,我都会尝试将数据保存到存档表中。

标签: c# .net wcf entity-framework wcf-data-services


【解决方案1】:

这不是我自己尝试做的事情,但有可能因为您已经在 SaveChanges() 方法中,所以已经创建了上下文的更改列表。因此,当您将新的 Contract 添加到上下文的 Contracts 集合中时,您必须在调用 base.SaveChanges() 之前让上下文重建其需要持久化回数据库的更改列表

【讨论】:

  • 如何使上下文重建其更改列表?
  • 我没有尝试过这样做,但是在ObjectContext 上(我假设DbContext 的工作方式大致相同)有一个DetectChanges() 方法应该更新ObjectStateManager新的变化。让它重新评估每个加载的条目似乎效率低下,因此您可以尝试直接与 ObjectStateManager 交互,我认为它会是 this.ObjectStateManager.ChangeObjectState(ctr, EntityState.Added);
【解决方案2】:

你应该做的是挂钩SavingChanges event of the ObjectContext。这将允许您保存到存档/审核表。 Here is an article 解释了如何做到这一点。我以前做过,效果很好。

【讨论】:

    【解决方案3】:

    我正在连接到自定义 Context 类(class MyContext : DbContext),但它不起作用。

    我终于求助于 WCF 数据服务类(类 MyDataService : DataService )并且效果很好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-10
      • 1970-01-01
      • 1970-01-01
      • 2021-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多