【发布时间】:2023-04-10 14:24:17
【问题描述】:
我有一个使用 SQL Server 后端的实体框架的 ASP.NET MVC 应用程序。
目标是通过 foreach 循环创建约 18 个 WPackage 条目:
foreach (var dbitem in dbCList)
该代码适用于单个 WPackage 条目,但我们有客户要求创建 300 多个 WPackage,因此尝试使用实体框架代码进行单个“添加”并循环创建 300 多个添加。
T-SQL 将非常具有挑战性,因为在创建时/在行创建时创建了许多键,因此对于活动 >> 资源,我们必须插入活动,抓取或记住活动键,然后添加具有新创建的活动密钥的资源。
每个WPackage(这是主父表)可以有以下一个或多个子表条目:
- 1+ 活动
- 每个活动都有 1 个以上的资源
- 1+ 预算
- 1+ 签名
- 1+ 成本代码
我们的架构或模型图将是:
WPackage
--Activities
-----Resources (child of Activities)
--CostCodes
--Budgets
--Signatures
以下代码失败:
dbContextTransaction.Commit();
出现错误:
事务操作无法执行,因为此事务有待处理的请求。
[HttpPost]
public ActionResult Copy([Bind(Include = "ID,WBSID,...***fields excluded for brevity")] Package model)
{
if (ModelState.IsValid)
{
try
{
using (var dbContextTransaction = db.Database.BeginTransaction())
{
var dbCList = db.Packages.Join(db.WBS,
*expression omitted for brevity*)
// this dbClist will build about 18 items in the collection for below loop
foreach (var dbitem in dbCList)
{
int testWPID = dbitem;
WPackage prvWP = db.WPackages.Find(dbitem);
int previousWPID = dbitem;
WPackage previousWP = db.WPackages.Find(dbitem);
model.ID = dbitem;
db.WPackages.Add(model);
db.SaveChanges();
var budgets = db.Budgets.Where(i => i.WPID == previousWPID);
foreach (Budget budget in budgets)
{
budget.WPID = model.ID;
db.Budgets.Add(budget);
}
var costCodes = db.CostCodes.Where(i => i.WPID == previousWPID);
foreach (CostCode costCode in costCodes)
{
costCode.WPID = model.ID;
db.CostCodes.Add(costCode);
}
var activities = db.Activities.Where(i => i.WPID == previousWPID);
// *code excluded for brevity*
var previousActivityID = activity.ID;
db.Activities.Add(activity);
db.SaveChanges();
var resources = db.Resources.Where(i => i.ActivityID == previousActivityID);
foreach (Resource resource in resources)
{
resource.WPID = model.ID;
resource.ActivityID = activity.ID;
resource.ActivityNumber = activity.ActivityNumber;
db.Resources.Add(resource);
db.SaveChanges();
}
}
var signatures = db.RolesAndSigs
.Where(i => i.KeyId == previousWPID && i.Type == "WPL")
.OrderBy(i => i.Role)
.OrderBy(i => i.Person);
foreach (RolesAndSig signature in signatures)
{
db.RolesAndSigss.Add(signature);
}
db.SaveChanges();
dbContextTransaction.Commit();
}
}
}
}
我还尝试让Commit() 在foreach dbitem 循环之外运行,例如:
db.SaveChanges();
//dbContextTransaction.Commit();
}
dbContextTransaction.Commit();
...但这会返回以下错误:
[例外] 属性“ID”是对象的关键信息的一部分,不能修改。
【问题讨论】:
标签: asp.net-mvc entity-framework