gpt4 book ai didi

c# - Entity Framework 5.0 复杂对象的 SaveChanges

转载 作者:太空宇宙 更新时间:2023-11-03 13:47:30 25 4
gpt4 key购买 nike

我有一个方法接受带有添加或更新记录的交易列表的输入参数。

我循环遍历列表以发现哪些被修改,哪些被添加使用:context.Entry(item).State = System.Data.EntityState.Modified;设置每笔交易的状态。

我遇到的问题是因为当我循环遍历交易的输入参数列表时,交易对象与 TransactionType 有关系,如果数据库中有多个具有相同交易 ID 的交易,我会收到以下错误:

An object with the same key already exists in the ObjectStateManager. The ObjectStateManager cannot track multiple objects with the same key.

  • 顺便说一句,我正在使用 EF5 和 Code First。

关注的方法是:

public TransactionList SaveTransactions(Transaction[] transactions)
{
try
{
using (EntityContext context = new EntityContext())
{
foreach (var item in transactions)
{
if (item.TransactionId > 0)
context.Entry(item).State = System.Data.EntityState.Modified;
else
context.Entry(item).State = System.Data.EntityState.Added;
}

context.SaveChanges();
}
return GetLatestTransactions();
}

##更新##如果我将每个项目的 TransactionType 设置为 null,我不会收到任何错误,其余的交易字段将被更新。即 TransAmount、Date 等。问题是,通过将 TransType 设置为 null,我将永远无法更改我的交易类型。

using (EntityContext context = new EntityContext())
{
foreach (var item in transactions)
{
//set the fk to null
item.TransactionType = null;

if (item.TransactionId > 0)
{
context.Entry(item).State = System.Data.EntityState.Modified;
}
else
context.Entry(item).State = System.Data.EntityState.Added;
}
context.SaveChanges();
}

## 更新 2 ##我只是找到了另一种可行的方法,但对我来说仍然不是理想的方法。我得到每个项目的单个事务,然后设置值。我不喜欢这个解决方案,因为 .Single 会为每次迭代进行一次往返。

foreach (var item in transactions)
{
var or = context.Transaction
.Include(t => t.Category)
.Include(t => t.TransactionReasonType)
.Include(t => t.TransactionType)
.Single(t => t.TransactionId == item.TransactionId);

if (item.TransactionId > 0)
{
context.Entry(or).CurrentValues.SetValues(item);
context.Entry(or).State = System.Data.EntityState.Modified;
}

最佳答案

我的问题的解决方案是将添加与更新分开。对于更新,从数据库中获取每一行,将原始值设置为新值。对于添加,只需将新值添加到上下文即可。

foreach (var item in transactions)
{
if (item.TransactionId > 0) //Update
{
var original = context.Transaction.Where(
t => t.TransactionId == item.TransactionId)
.FirstOrDefault();

original.TransactionType = context.TypeTransaction.Single(
p => p.TypeTransactionId == item.TransactionType.TypeTransactionId);

context.Entry(original).CurrentValues.SetValues(item);
}
else //Insert
{
item.TransactionType = context.TypeTransaction.Single(
p => p.TypeTransactionId == item.TransactionType.TypeTransactionId);

context.Transaction.Add(item);
}
}

context.SaveChanges();

关于c# - Entity Framework 5.0 复杂对象的 SaveChanges,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14787683/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com