1. ホーム
  2. c#

[解決済み] [Entity Framework 4.1でエンティティに関連オブジェクトを追加する際に、エンティティオブジェクトをIEntityChangeTracker.の複数のインスタンスから参照できない。

2022-01-26 22:24:05

質問

従業員の詳細を保存しようとしていますが、その従業員には都市への参照があります。しかし、検証済みの連絡先を保存しようとすると、毎回例外が発生します。 "ADO.Net Entity Framework An entity object cannot be referenced by multiple instances of IEntityChangeTracker"

多くの投稿を読みましたが、まだ何をすべきかの正確なアイデアが得られていません...。 私の保存ボタンをクリックするコードは次のとおりです。

protected void Button1_Click(object sender, EventArgs e)
    {
        EmployeeService es = new EmployeeService();
        CityService cs = new CityService();

        DateTime dt = new DateTime(2008, 12, 12);
        Payroll.Entities.Employee e1 = new Payroll.Entities.Employee();

        Payroll.Entities.City city1 = cs.SelectCity(Convert.ToInt64(cmbCity.SelectedItem.Value));

        e1.Name = "Archana";
        e1.Title = "aaaa";
        e1.BirthDate = dt;
        e1.Gender = "F";
        e1.HireDate = dt;
        e1.MaritalStatus = "M";
        e1.City = city1;        

        es.AddEmpoyee(e1,city1);
    }

そして 従業員サービスコード

public string AddEmpoyee(Payroll.Entities.Employee e1, Payroll.Entities.City c1)
        {
            Payroll_DAO1 payrollDAO = new Payroll_DAO1();
            payrollDAO.AddToEmployee(e1);  //Here I am getting Error..
            payrollDAO.SaveChanges();
            return "SUCCESS";
        }

解決方法は?

なぜなら、この2行は ...

EmployeeService es = new EmployeeService();
CityService cs = new CityService();

...はコンストラクタでパラメータを取らないので、クラス内でコンテキストを作成しているのでしょう。を読み込むと city1 ...

Payroll.Entities.City city1 = cs.SelectCity(...);

...あなたは city1 でコンテキストに CityService . 後で city1 への参照として、新しい Employee e1 を追加し e1 への参照を含む。 city1 にあるコンテキストに EmployeeService . その結果、あなたは city1 が 2 つの異なるコンテキストにアタッチされているため、例外が発生するのです。

サービスクラスの外部でコンテキストを作成し、それを両方のサービスに注入して使用することで、これを修正できます。

EmployeeService es = new EmployeeService(context);
CityService cs = new CityService(context); // same context instance

あなたのサービスクラスは、単一のエンティティタイプにのみ責任を負うリポジトリに少し似ています。このような場合、サービスに個別のコンテキストを使用すると、エンティティ間のリレーションシップが関与した時点で、常に問題が発生します。

また、密接に関連するエンティティのセットを担当する1つのサービスを作成することもできます。 EmployeeCityService (これは単一のコンテキストを持ちます) そして、全体の操作をあなたの Button1_Click メソッドをこのサービスのメソッドに渡す。