打开一个特定表单时出现此错误。其余的工作正常,我不知道为什么不这样做。
错误:尝试附加或添加非新的实体,可能是从另一个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();
}
}
答案 0 :(得分:0)
不是直接回答,但这是非常糟糕的设计,对不起。
的问题:
每个班级实例一个上下文实例。太不可思议了。你打算如何管理工作单位和交易?那么内存消耗和性能呢?
间接:每个实体实例(前缀o
)都包含在cls
类中。如果有必要,让课程合作或访问他们的财产是多么麻烦。
DRY :远离它。每个clsBase
派生词都有与clsPermanency
相同的方法吗?
构造函数:您始终必须调用基础构造函数。带int iID
的构造函数总是会导致创建一个冗余的new
对象,在处理更大的数字时肯定会有明显的性能损失。构造函数逻辑的微小更改可能会导致构造函数调用序列发生更改。 (嵌套和继承的构造函数总是很棘手)。
异常处理:在创建类的任何地方都需要try-catch。 (顺便说一句:如果记录不存在,First()
会抛出自己的异常。)
最后,不是真正的问题,但类和变量名前缀是sooo 19xx。
_oPermanency
实例(在Id-d构造函数中)和保存它之间的某个位置创建了新的_oDBConnection
。所示的代码并未揭示这是如何发生的,但我认为代码多于此。当您调试并检查_oDBConnection
个实例的GetHashCode()时,您应该能够找到它发生的位置。