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. クラスインスタンスごとに1つのコンテキストインスタンス。かなり信じられない。作業単位とトランザクションをどのように管理しますか?そして、メモリ消費とパフォーマンスはどうですか?

  2. 間接参照:すべてのエンティティインスタンス(接頭辞o)はclsクラスにラップされます。必要に応じて、クラスを連携させたり、クラスのプロパティにアクセスしたりするのは、なんと面倒なことでしょう。

  3. ドライ:それからは程遠い。各clsBase導関数はと同じ方法を持っていclsPermanencyますか?

  4. コンストラクター:常に基本コンストラクターを呼び出す必要があります。コンストラクターを使用すると、int iID常に冗長newオブジェクトが作成されます。これは、より大きな数を処理する場合に、パフォーマンスに大きな影響を与えることは確かです。コンストラクターロジックの小さな変更により、コンストラクター呼び出しのシーケンスが変更される場合があります。(ネストされたコンストラクターと継承されたコンストラクターは常に注意が必要です)。

  5. 例外処理:クラスが作成されるすべての場所でtry-catchが必要です。(BTW:First()レコードがない場合は、独自の例外をスローします)。

最後に、実際の問題ではありませんが、クラス名と変数名のプレフィックスはすっごく19xxです。

何をすべきか?

  • 同僚が不在の場合、同僚のデザインを変更することはできないと思います。しかし、私はそれについて彼にやがて本当に話したいと思います。いくつかのlinq-to-sqlの例を調べて、いくつかの規則的なパターンを取得してください。
  • _oPermanency例外は、インスタンスのフェッチ(Id-dコンストラクター内)とインスタンスの保存の間のどこかで新しいインスタンス_oDBConnectionが作成されることを示します。示されているコードは、これがどのように発生するかを明らかにしていませんが、これよりも多くのコードがあると思います。インスタンスのGetHashCode()をデバッグして確認すると_oDBConnection、それが発生する場所を見つけることができるはずです。
于 2012-08-06T18:17:05.667 に答える