【问题标题】:Getting DataContext error while saving form保存表单时出现 DataContext 错误
【发布时间】:2012-08-06 14:17:02
【问题描述】:

我在打开一个特定表单时收到此错误。其余的工作正常,我不知道为什么这个不行。

错误:尝试附加或添加一个不是新的实体,可能是从另一个 DataContext 加载的。这不受支持。

当我尝试保存时,我在 _oDBConnection 处收到错误。当我在运行代码时观看 _oDBConnection 时,它不存在。即使我打开主窗口它也不存在。所以这个表单是第一次构建 DataContext 的地方。

每个类都继承自构建 DataContext 的 clsBase。

我的同事是打造这一切的专业人士。我只是在扩展和使用它(边做边学)。但现在我被困住了,他正在度假。所以保持简单:-)

会是什么?

clsPermanency

namespace Reservation
{
    class clsPermanency : clsBase
    {
        private tblPermanency _oPermanency;

        public tblPermanency PermanencyData
        {
            get { return _oPermanency; }
            set { _oPermanency = value; }
        }

        public clsPermanency()
            : base()
        {
            _oPermanency = new tblPermanency();
        }       
        public clsPermanency(int iID)
            : this()
        {
            _oPermanency = (from oPermanencyData in _oDBConnection.tblPermanencies
                            where oPermanencyData.ID == iID
                            select oPermanencyData).First();

            if (_oPermanency == null)
                throw new Exception("Permanentie niet gevonden");
        }

        public void save()
        {
            if (_oPermanency.ID == 0)
            {
                _oDBConnection.tblPermanencies.InsertOnSubmit(_oPermanency);
            }
            _oDBConnection.SubmitChanges();
        }
    }
}

clsBase

public class clsBase
{
    protected DBReservationDataContext _oDBConnection;
    protected int _iID;

    public int ID
    {
        get { return _iID; }
    }

    public DBReservationDataContext DBConnection
    {
        get { return _oDBConnection; }
    }

    public clsBase()
    {
        _oDBConnection = new DBReservationDataContext();
    }

}

【问题讨论】:

    标签: linq datacontext


    【解决方案1】:

    不是一个直接的答案,但这确实是糟糕的设计,抱歉。

    问题:

    1. 每个类实例一个上下文实例。相当不可思议。您将如何管理工作单元和事务?那么内存消耗和性能呢?

    2. 间接:每个实体实例(前缀为o)都包装在cls 类中。如有必要,让类合作或访问它们的属性是多么麻烦。

    3. DRY:远非如此。是否每个clsBase 派生的方法都与clsPermanency 相同?

    4. 构造函数:您始终必须调用基本构造函数。带有int iID 的构造函数总是会导致创建一个冗余的new 对象,这在处理更大的数字时肯定会对性能造成显着影响。构造函数逻辑的微小变化可能会导致构造函数调用的顺序发生变化。 (嵌套和继承的构造函数总是很棘手)。

    5. 异常处理:在创建类的任何地方都需要 try-catch。 (顺便说一句:如果记录不存在,First() 将抛出自己的异常)。

    最后,这不是一个真正的问题,但类和变量名前缀太 19xx。

    怎么办?

    • 我认为您无法在同事不在的情况下更改他的设计。但我真的会在适当的时候和他谈谈。只需研究一些 linq-to-sql 示例即可掌握一些常规模式。
    • 异常表明在获取_oPermanency 实例(在Id-d 构造函数中)和保存它之间的某个位置创建了一个新的_oDBConnection。所示的代码并未揭示这是如何发生的,但我认为还有比这更多的代码。当您调试并检查 _oDBConnection 实例的 GetHashCode() 时,您应该能够找到它发生的位置。

    【讨论】:

    • 感谢您的诚实。我只能回答第一点和最后一点,其他的都超出了我的知识范围。我首先使用静态 DataContext,但是在同时使用程序的 2 个实例时,一个实例中更改的数据没有在另一个实例中重新加载。 LINQ 正在检索存储在缓存中的旧值。新添加的记录已加载。第 5 点:是的,我知道...
    • 是的,静态上下文很糟糕,所以这是一个很好的设计决策:D。我希望调试能揭示一些东西。修复别人的代码真是太棒了。
    猜你喜欢
    • 1970-01-01
    • 2017-11-13
    • 2016-02-28
    • 2019-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    • 1970-01-01
    相关资源
    最近更新 更多