1

所以我有一个通过 Linq-To-Sql 存储在数据库中的 IT/开发人员票证列表。保存尝试仅在用户请求时进行,或者如果他们说关闭时保存。我担心的是用户更改了 2 个或更多票证而没有在两者之间进行保存。

出于某种原因,如果数据库拒绝对一个的更改,并没有给我太多关于哪个项目或哪个工单上的哪个字段有问题的信息,所以我可以将其绑定回给用户一个指标。现在我无法保存他们编辑的记录上的好数据,因为一个更改卡在队列中,现在 SubmitChanges 不再起作用。

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

  • 我可以创建一个新的 dataContext 实例
  • 尝试保存单个行的更改
  • 然后向用户报告每一个失败的结果。

我猜的代码很臭,或者至少很难看。

我的同事刚刚建议我尝试交易。我宁愿不拆毁我为测试事务方法而构建的东西。

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

也许我不应该允许(因为 linq-to-sql 或现实世界不需要在不决定保存或不保存的情况下对多个单元进行更改的能力)用户离开票证,直到他们决定是否想要是否保存更改?

4

1 回答 1

0

我推出了自己的缓冲类,这有点乱,但可以确保一次保存一条记录。

这是围绕 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();
    }
}

这是其中一个属性的示例:

#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
于 2009-09-14T23:50:27.137 回答