Sql server 2005 删除行并插入具有相同主键的新行后实体框架事务错误
我正在Visual Studio 2008中使用ASP.NET MVC2。我相信SQL Server是2005年的。我正在使用实体框架访问数据库 我得到了下表,其中包含基于Sql server 2005 删除行并插入具有相同主键的新行后实体框架事务错误,sql-server-2005,entity-framework,Sql Server 2005,Entity Framework,我正在Visual Studio 2008中使用ASP.NET MVC2。我相信SQL Server是2005年的。我正在使用实体框架访问数据库 我得到了下表,其中包含基于iRequest和sCode的复合主键: RequestbyCount iRequest integer sCode varchar(10) iCount integer iRequest是请求列表的外键 更新请求时,我希望清除该请求的现有RequestbyCounts,然后添加新的R
iRequest
和sCode
的复合主键:
RequestbyCount
iRequest integer
sCode varchar(10)
iCount integer
iRequest
是请求列表的外键
更新请求时,我希望清除该请求的现有RequestbyCounts
,然后添加新的RequestbyCounts
。更有可能的是,旧行之间的唯一区别将是计数
对于我的代码,我尝试如下操作:
//delete ALL our old requests
var oldEquipList = (from eq in myDB.dbEquipmentRequestedbyCountSet
where eq.iRequestID == oldData.iRequestID
select eq).ToList();
foreach (var oldEquip in oldEquipList)
{
myDB.DeleteObject(oldEquip);
}
// myDB.SaveChanges(); <---- adding this line makes it work
//add in our new requests
foreach (var equip in newData.RequestList) //newData.RequestList is a List object
{
if (equip.iCount > 0)
{
//add in our actual request items
RequestbyCount reqEquip = new RequestbyCount();
reqEquip.sCodePrefix = equip.sCodePrefix;
reqEquip.UserRequest = newRequest;
reqEquip.iCount = equip.iCount;
myDB.AddToRequestbyCount(reqEquip);
}
}
myDB.SaveChanges(); //save our results
我是否被困在上面的代码中,这些代码基本上是对数据库进行一系列的小调用,以检查项目是否存在
或者是否有某种方法告诉框架尝试删除我想要的行,但在插入新行失败时回滚?您似乎根本没有使用事务。你需要把你所有的代码都包起来
using (TransactionScope transaction = new TransactionScope())
{
...
transaction.Complete();
}
更好
using (TransactionScope transaction = new TransactionScope())
{
try
{
your code
transaction.Complete();
}
catch(Exception)
{
// handle error
}
}
使用try/catch块将确保在发生异常时不会提交事务,这正是您所希望的
更多关于实体框架事务的信息,请访问。那里的解释很好。没错。。。我没有明确使用事务。但在本例中,我仍然对实体框架的行为一无所知。从表面上看,它没有按照我提供的陈述行事。它应该按照给出的顺序进行操作,因此不应该有任何数据导致主键失败。@John Stone我想我明白了。您认为EF会将您的更改排队,然后在调用SaveChanges()时按顺序应用它们,这就是事务的工作方式。我不太清楚EF的内部工作原理,但我怀疑它不是这样工作的,因为EF只能管理对象的一种状态。换句话说,如果您正在添加id为1的对象,EntityState将标记为已添加-如果您刚刚将同一对象(相同id)标记为删除(即DeleteObject()),它将更改回AddContent。。使用您设置的新属性。调用SaveChanges()时,第一个状态将丢失。EF尝试插入该行,但从未实际删除该行。在TransactionScope中执行删除和添加操作,并在删除后调用SaveChanges)将解决您对“全部”或“无”的担忧。感谢您的快速浏览。我想这就是我想要解决的问题。
using (TransactionScope transaction = new TransactionScope())
{
try
{
your code
transaction.Complete();
}
catch(Exception)
{
// handle error
}
}