Linq-To-Sql SubmitChanges不更新数据库

时间:2015-04-22 17:00:03

标签: asp.net sql-server linq-to-sql

我已经阅读了与此类似的多个问题,但没有一个是我的情况。

使用linq-to-sql我插入一条新记录并提交更改。然后,在同一个Web请求中,我拉出相同的记录,然后更新它,然后提交更改。更改未保存。这两个操作的DatabaseContext是相同的。

插入:

var transaction = _factory.CreateTransaction(siteId, userId, questionId, type, amount, transactionId, processor);

using (IUnitOfWork unitOfWork = UnitOfWork.Begin())
{
    transaction.Amount = amount;

    _transactionRepository.Add(transaction);

    unitOfWork.Commit();
}

选择并更新:

ITransaction transaction = _transactionRepository.FindById(transactionId);

if (transaction == null) throw new Exception(Constants.ErrorCannotFindTransactionWithId.FormatWith(transactionId));

using (IUnitOfWork unitOfWork = UnitOfWork.Begin())
{
    transaction.CrmId = crmId;

    transaction.UpdatedAt = SystemTime.Now();

    unitOfWork.Commit();
}

这是工作单元代码:

public virtual void Commit()
{
    if (_isDisposed)
    {
        throw new ObjectDisposedException(GetType().Name);
    }

    _database.SubmitChanges();
}

我甚至进入了designer.cs文件并在正在设置但未更新的字段上放置了断点。我介入并输入并执行了set代码,因此实体应该被“通知”此字段的更改:

public string CrmId
{
    get
    {
        return this._CrmId;
    }
    set
    {
        if ((this._CrmId != value))
        {
            this.OnCrmIdChanging(value);
            this.SendPropertyChanging();
            this._CrmId = value;
            this.SendPropertyChanged("CrmId");
            this.OnCrmIdChanged();
        }
    }
}

其他有用信息:

  • 已启用ObjectTracking
  • 调用第二个SubmitChanges时没有错误或异常(只是默默地无法更新)
  • SQL分析器显示插入和选择,但不显示后续更新语句。 Linq-To-Sql没有生成更新语句。
  • 只有一个数据库,一个数据库字符串,因此更新不会转到另一个数据库
  • 该表有一个主键。

我不知道是什么原因会导致Linq-To-Sql不发出更新命令而不会引发某种错误。也许问题源于使用相同的DataContext实例?我甚至在使用DataContact.Refresh方法从数据库中刷新了对象,然后再进行更新,但这没有帮助。

1 个答案:

答案 0 :(得分:0)

我发现可能是根本原因。我正在使用Unity。初始插入正在具有PerWebRequest生存期的服务类中执行。选择和更新发生在具有Singleton生命周期的类中。所以我假设DataContext实例是相同的是不正确的。

因此,在具有Singleton生命周期的类中,我获得了数据库存储库的新实例并执行更新,没有问题。

现在我仍然不知道为什么原始代码不起作用,我的方法仍然可以被认为是一种解决方法而不是解决方案,但它确实解决了我的问题并希望对其他人有用。