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

我正在Visual Studio 2008中使用ASP.NET MVC2。我相信SQL Server是2005年的。我正在使用实体框架访问数据库

我得到了下表,其中包含基于
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
    }
}