Linq to sql 使用事务是否会消除使用辅助数据上下文尝试sql插入/更新/删除的需要?

Linq to sql 使用事务是否会消除使用辅助数据上下文尝试sql插入/更新/删除的需要?,linq-to-sql,transactions,ticket-system,Linq To Sql,Transactions,Ticket System,因此,我有一个通过Linq到Sql存储在数据库中的IT/开发人员票证列表。保存尝试仅在用户请求时进行,或者如果他们说“关闭时保存”。我担心的是,一个用户在两张或两张以上的票证之间进行更改而不进行保存 出于某种原因,如果数据库拒绝更改为1,则不会向我提供关于哪个项目或哪个票证字段有问题的很多信息,因此我可以将其与向用户提供指示器联系起来。现在我无法保存他们编辑的记录上的好数据,因为一个更改被卡在队列中,而现在SubmitChanges不再起作用 我构建了一个缓冲系统,其中每个票证包装在另一个类中,

因此,我有一个通过Linq到Sql存储在数据库中的IT/开发人员票证列表。保存尝试仅在用户请求时进行,或者如果他们说“关闭时保存”。我担心的是,一个用户在两张或两张以上的票证之间进行更改而不进行保存

出于某种原因,如果数据库拒绝更改为1,则不会向我提供关于哪个项目或哪个票证字段有问题的很多信息,因此我可以将其与向用户提供指示器联系起来。现在我无法保存他们编辑的记录上的好数据,因为一个更改被卡在队列中,而现在SubmitChanges不再起作用

我构建了一个缓冲系统,其中每个票证包装在另一个类中,以便将更改保存到一个缓冲区,而不是直接保存到linq to sql对象,其中每个票证更改:

  • 我可以创建一个新的dataContext实例
  • 尝试保存对单个行的更改
  • 然后向用户报告每一个失败的情况
我猜代码有点异味,或者至少很难看

我的同事建议我试试交易。我不想拆掉我为测试事务性方法而构建的东西

  • 事务是否正确重置对某个项目的所有更改,或者是否正确重置SaveChanges将尝试保存的所有项目?之后,我希望hasChanges为空,SaveChanges不做任何事情
  • 在linq to sql中,是否有更好的方法一次提交单个行的更改
  • 在SaveChanges异常中是否遗漏了一些可以帮助我了解哪一行以及该行上的哪个字段有问题的内容

也许我不应该允许(因为linq to sql或者现实世界不需要在不决定是否保存的情况下对多个单元进行更改)用户在决定是否保存更改之前离开票据?

我已经使用了自己的缓冲类,这有点混乱,但一次保存一张唱片确实有效

这是围绕linq实体的业务对象的父类

public class BufferedLinqChange
{
    LqGpsDataContext _dataContext;

    internal BufferedLinqChange(LqGpsDataContext dataContext)
    {
        _dataContext = dataContext;
    }

    protected void SetBufferedProperty<T>(string key,Action linqAction
        ,bool linqEqualsValue,Action bufferAction)
    {
        if (linqEqualsValue)
        {
            if (Changes.ContainsKey(key))
                Changes.Remove(key);
        }
        else
        Changes.InsertOrUpdate(key, linqAction); bufferAction();
    }

    protected Dictionary<String, Action> Changes = new Dictionary<string, Action>();

    public int ChangeCount { get { return Changes != null ? Changes.Count : 0; } }
    public bool hasChanges { get { return Changes != null ? Changes.Count > 0 : false; } }

    public void SubmitChanges()
    {
        _dataContext.SubmitChanges();
        if (ChangeCount > 0)
        {
            Changes.ForEach((item) => item.Value.Invoke());
            _dataContext.SubmitChanges();
        }
    }
    public void CancelChanges()
    {
        if (Changes != null)
            Changes.Clear();
    }
}
公共类BufferedLinqChange
{
LqGpsDataContext_dataContext;
内部缓冲LinqChange(LqGpsDataContext数据上下文)
{
_dataContext=dataContext;
}
受保护的void SetBufferedProperty(字符串键、操作linqAction
,bool linqequals值,Action bufferAction)
{
if(linqEqualsValue)
{
if(变更。集装箱箱(钥匙))
更改。删除(键);
}
其他的
InsertOrUpdate(key,linqAction);bufferAction();
}
受保护的字典更改=新建字典();
public int changecont{get{return Changes!=null?Changes.Count:0;}
public bool hasChanges{get{return Changes!=null?Changes.Count>0:false;}
公开作废提交更改()
{
_dataContext.SubmitChanges();
如果(更改计数>0)
{
Changes.ForEach((item)=>item.Value.Invoke());
_dataContext.SubmitChanges();
}
}
公共更改()
{
如果(更改!=null)
更改。清除();
}
}
以下是其中一个属性的示例:

#region assetTag


    String _AssetTag;
    public const String STR_assetTag = "assetTag";
    public String assetTag
    {
        get { return (Changes.ContainsKey(STR_assetTag) ? _AssetTag : Asset.assetTag); }
        set
        {
            SetBufferedProperty<String>(STR_assetTag
                , () => Asset.assetTag = value, Asset.assetTag == value, () => _AssetTag = value);
        }
    }
    #endregion
#地区资产表
字符串_AssetTag;
public const String STR_assetTag=“assetTag”;
公共字符串断言
{
获取{return(Changes.ContainsKey(STR_assetTag)?\u assetTag:Asset.assetTag);}
设置
{
SetBufferedProperty(STR_assetTag
,()=>Asset.assetTag=value,Asset.assetTag==value,()=>\u assetTag=value);
}
}
#端区

我在博客上发布了更多我在网站上使用的代码