Entity Frameworkを使用して複数のコンテキストのオブジェクトを関連付ける方法
-
03-07-2019 - |
質問
私はエンティティフレームワークに非常に新しいので、我慢してください...
異なるコンテキストの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;
}
1つのコンテキストを使用することは、ASP.NETアプリケーションでEFを使用しているため、オプションではありません。
解決
同じコンテキストを使用するか(コンテキストを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つのアプローチは、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();
}
はい-2つ以上のコンテキストでの作業は、Entity Framework V1ではサポートされていません。
まだ見つけていない場合は、 http://blogs.msdn.com/dsimmons/pages/entity-framework-faq.aspx
私が理解していることから、できる限りめったにモデルをインスタンス化したくない(" new XXXXEntities()"ビットを使用)。 MSによると( http://msdn.microsoft.com/en-us/ library / cc853327.aspx )、これはかなり大きなパフォーマンスヒットです。そのため、using()構造でラップするのは良い考えではありません。私のプロジェクトで行ったことは、コンテキストの同じインスタンスを常に提供する静的メソッドを介してアクセスすることです:
private static PledgeManagerEntities pledgesEntities;
public static PledgeManagerEntities PledgeManagerEntities
{
get
{
if (pledgesEntities == null)
{
pledgesEntities = new PledgeManagerEntities();
}
return pledgesEntities;
}
set { pledgesEntities = value; }
}
そして次のように取得します:
private PledgeManagerEntities entities = Data.PledgeManagerEntities;