Entity Frameworkを使用して複数のコンテキストからオブジェクトを関連付ける方法

.net c# entity-framework

質問

私は、エンティティフレームワークに非常に新しいですので、私と一緒に負担してください...

異なるコンテキストの2つのオブジェクトをどのように関連付けますか。

以下の例では、次の例外が発生します。

System.InvalidOperationException:2つのオブジェクトは異なるObjectContextオブジェクトに関連付けられているため、それらの間の関係を定義できません。

void MyFunction()
{
    using (TCPSEntities model = new TCPSEntities())
    {
        EmployeeRoles er = model.EmployeeRoles.First(p=>p.EmployeeId == 123);
        er.Roles = GetDefaultRole();
        model.SaveChanges();
     }
}

private static Roles GetDefaultRole()
{
    Roles r = null;
    using (TCPSEntities model = new TCPSEntities())
    {
        r = model.Roles.First(p => p.RoleId == 1);
    }
    return r;
}

ASP.NETアプリケーションでEFを使用しているため、1つのコンテキストを使用することは選択肢になりません。

受け入れられた回答

同じコンテキストを使用するか(コンテキストをgetdefaultroleメソッドに渡すことができます)、または関係を再考してエンティティを拡張する必要があります。

編集:これを追加することを望んだ、asp.netを使用することはあなたが完全にあなたの文脈と関係デザインを考え出すことを要求するでしょう、提供された例のためでした。

あなたは単にコンテキストを渡すことができます.. IE:

void MyFunction()
{
    using (TCPSEntities model = new TCPSEntities())
    {
        EmployeeRoles er = model.EmployeeRoles.First(p=>p.EmployeeId == 123);
        er.Roles = GetDefaultRole(model);
        model.SaveChanges();
     }

}

private static Roles GetDefaultRole(TCPSEntities model)
{
    Roles r = null;
    r = model.Roles.First(p => p.RoleId == 1);
    return r;
}

人気のある回答

ここで使用できるもう1つの方法は、あるコンテキストからオブジェクトをデタッチしてから、それらを別のコンテキストにアタッチすることです。これはちょっとしたハックであり、あなたの状況ではうまくいかないかもしれませんが、それは選択肢かもしれません。

    public void GuestUserTest()
    {
        SlideLincEntities ctx1 = new SlideLincEntities();
        GuestUser user = GuestUser.CreateGuestUser();
        user.UserName = "Something";
        ctx1.AddToUser(user);
        ctx1.SaveChanges();

        SlideLincEntities ctx2 = new SlideLincEntities();
        ctx1.Detach(user);
        user.UserName = "Something Else";
        ctx2.Attach(user);
        ctx2.SaveChanges();
    }


ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ