保存表单时出现DataContext错误

时间:2012-08-06 14:17:02

标签: linq datacontext

打开一个特定表单时出现此错误。其余的工作正常,我不知道为什么不这样做。

错误:尝试附加或添加非新的实体,可能是从另一个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();
    }

}

1 个答案:

答案 0 :(得分:0)

不是直接回答,但这是非常糟糕的设计,对不起。

的问题:

  1. 每个班级实例一个上下文实例。太不可思议了。你打算如何管理工作单位和交易?那么内存消耗和性能呢?

  2. 间接:每个实体实例(前缀o)都包含在cls类中。如果有必要,让课程合作或访问他们的财产是多么麻烦。

  3. DRY :远离它。每个clsBase派生词都有与clsPermanency相同的方法吗?

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

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

  6. 最后,不是真正的问题,但类和变量名前缀是sooo 19xx。

    怎么办?

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