0

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

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

}
4

1 回答 1

0

不是直接的答案,但这是非常糟糕的设计,抱歉。

问题:

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

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

  3. 干燥:远非如此。每个clsBase导数是否具有与 相同的方法clsPermanency

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

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

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

该怎么办?

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