C# 处理实体框架SaveChanges()异常以进行清理

C# 处理实体框架SaveChanges()异常以进行清理,c#,.net,entity-framework,exception,entity-framework-4,C#,.net,Entity Framework,Exception,Entity Framework 4,我有一个文件存储库,用于将文件保存到服务器上。在保存物理文件的同时,还记录了一个数据库条目 下面是插入方法 public DataFile InsertFile(string fileName, byte[] fileBytes) { File.WriteAllBytes(Path.Combine(FileRepPath, fileName), fileBytes); DataFile dataFile = NewDataFile( fileName,

我有一个文件存储库,用于将文件保存到服务器上。在保存物理文件的同时,还记录了一个数据库条目

下面是插入方法

public DataFile InsertFile(string fileName, byte[] fileBytes)
{
    File.WriteAllBytes(Path.Combine(FileRepPath, fileName), fileBytes);

    DataFile dataFile = NewDataFile(
        fileName,
        fileBytes.Length
    );

    try
    {
        using (MyEntities context = new MyEntities())
        {
            context.DataFiles.Add(dataFile);
            context.SaveChanges();
        }
    }
    catch (Exception)
    {
        File.Delete(Path.Combine(FileRepPath, fileName));
        throw;
    }

    return dataFile;
}
如果数据库更新失败,那么我想从服务器上删除该文件。我通过捕获上下文操作中发生的任何异常并删除该文件(并重新抛出错误以使其冒泡)来实现这一点

这是正确的做法吗?我应该捕获更具体的异常吗?

我建议您使用该对象为您管理此任务。实现接口的每个组件都可以参与
TransactionScope
的两阶段提交

提交将需要登记MS-DTC的服务,但它将确保保存全部或全部。MS-DTC用于协调跨多个异构资源的事务结果

以下是几篇Microsoft文章:


此问题询问如何捕获所有实体框架异常。请注意,如果出现系统故障,您可能仍然会在磁盘上保存该文件,但数据库中没有该记录。如果出现并发异常或唯一约束冲突,则可能是其他人在当前用户之前添加了
数据文件
,因此您不想从磁盘上删除该文件。