我已经阅读了与此类似的多个问题,但没有一个是我的情况。
使用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();
}
}
}
其他有用信息:
我不知道是什么原因会导致Linq-To-Sql不发出更新命令而不会引发某种错误。也许问题源于使用相同的DataContext实例?我甚至在使用DataContact.Refresh方法从数据库中刷新了对象,然后再进行更新,但这没有帮助。
答案 0 :(得分:0)
我发现可能是根本原因。我正在使用Unity。初始插入正在具有PerWebRequest生存期的服务类中执行。选择和更新发生在具有Singleton生命周期的类中。所以我假设DataContext实例是相同的是不正确的。
因此,在具有Singleton生命周期的类中,我获得了数据库存储库的新实例并执行更新,没有问题。
现在我仍然不知道为什么原始代码不起作用,我的方法仍然可以被认为是一种解决方法而不是解决方案,但它确实解决了我的问题并希望对其他人有用。