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);
}
}
}
Transaction
和 AuthorizationHistory
是 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 .
我正致力于在一个单独的项目中建立一个新的 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);
}
}
}
Transaction
和 AuthorizationHistory
是 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 .