Entity framework 对象在传递后没有更新

Entity framework object not updating after being passed around

我正致力于在一个单独的项目中建立一个新的 MVC 支付站点,该站点具有依赖注入的数据库连接,并像我一样尝试一些新事物。目前,我正在尝试从数据库中加载现有交易,授权卡支付,然后将结果保存回数据库。简单明了,但是当我调用 SaveChanges() 时,没有任何东西被保存,我 运行 没有东西可以尝试。

此数据库交互由 CheckoutDataProvider:

处理
public class CheckoutDataProvider : ICheckoutDataProvider
{
    private readonly CheckoutEntities _context;

    public CheckoutDataProvider(CheckoutEntities _context)
    {
        this._context = _context;
    }



    public ITransaction GetTransactionDetails(Guid transactionId)
    {
        var trans = _context.Transactions.FirstOrDefault(x => x.CheckoutTransactionId == transactionId);
        return trans; // It's OK if trans == null, because the caller will expect that.

    }

    public void AddAuthorization(ITransaction  transaction, IAuthorizationHistory history)
    {
        try
        {
            var trans = (Transaction)transaction;
            var hist = (AuthorizationHistory)history;
            trans.AuthorizationHistories.Add(hist);
            _context.SaveChanges();
        }
        catch (DbEntityValidationException ex)
        {
            throw new InvalidDataException(ex.EntityValidationErrors.First().ValidationErrors.First().ErrorMessage, ex);
        }
    }
}

TransactionAuthorizationHistory 是 EF 对象,直接对应于数据库表。 CheckoutEntities 是上下文,由 Ninject 注入。

GetTransactionDetails() 完美运行。我给它 transactionId,我得到对象,然后我使用该数据到 运行 卡并生成 AuthorizationHistory class。然后我调用 AddAuthorization() 将其附加到事务并将其保存到数据库。但是新的 AuthorizationHistory 对象和对原始 Transaction 的任何更改都无法保存。

我可以通过检查 _context 对象得知它不知道任何更改,如果我使用 GetTransactionDetails() 进行更改(在它作为接口返回之前)它们 坚持下去。所以这看起来像是演员阵容的问题(无论如何这让我感到恶心,所以我很想知道这就是问题所在)。

我是不是遗漏了什么明显的东西?是否缺少某些东西才能使其正常工作?有没有办法避免在 AddAuthorization() 中进行转换?

可能您没有在 GetTransactionDetails 和 AddAuthoritzation 之间共享同一个 DBContext。由于这个原因 Entity Framework 无法跟踪更改。

为网络请求设置DBContext的范围寿命,你可以用Ninject和.InRequestScope() https://github.com/ninject/ninject/wiki/Object-Scopes来完成,使用这个选项在网络请求期间将使用相同的DBContext .