Как связать объекты из нескольких контекстов с помощью Entity Framework
-
03-07-2019 - |
Вопрос
Я очень новичок в структуре сущности, поэтому, пожалуйста, потерпите меня...
Как я могу связать вместе два объекта из разных контекстов?
В приведенном ниже примере выдается следующее исключение:
System.InvalidOperationException:Отношения между двумя объектами не могут быть определены, потому что они прикреплены к различным объектам 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;
}
Использование одного контекста недопустимо, поскольку мы используем EF в приложении ASP.NET.
Решение
Вам придется использовать тот же контекст (вы можете передать контекст методу getdefaultrole) или переосмыслить отношения и расширить сущность.
РЕДАКТИРОВАТЬ:Хотел добавить, что это было для приведенного примера: использование asp.net потребует от вас полностью продумать свой контекст и структуру отношений.
Вы можете просто передать контекст..ИЕ:
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;
}
Другие советы
Другой подход, который вы можете здесь использовать, — это отсоединить объекты от одного контекста, а затем присоединить их к другому контексту.Это своего рода хитрость, и она может не сработать в вашей ситуации, но это может быть вариантом.
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();
}
Да, работа в двух или более контекстах не поддерживается в версии 1 Entity Framework.
На тот случай, если вы еще не нашли его, есть хорошие часто задаваемые вопросы по EF по адресу http://blogs.msdn.com/dsimmons/pages/entity-framework-faq.aspx
Насколько я понимаю, вы хотите создавать экземпляр своей модели (с помощью бита «new XXXXEntities()») как можно реже.По данным МС (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;