Как связать объекты из нескольких контекстов с помощью платформы Entity Framework
Я очень новый для структуры сущности, поэтому, пожалуйста, несите меня...
Как я могу связать два объекта из разных контекстов вместе?
В приведенном ниже примере выдается следующее исключение:
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.
Ответы
Ответ 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;
}
Ответ 2
Другой подход, который вы можете использовать здесь, - это отделить объекты от одного контекста и затем привязать их к другому контексту. Это немного взломанный, и он может не работать в вашей ситуации, но это может быть вариант.
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();
}
Ответ 3
Yep - работа в двух или более контекстах не поддерживается в V1 платформы Entity Framework.
На всякий случай, если вы еще не нашли его, есть хороший faq на EF на http://blogs.msdn.com/dsimmons/pages/entity-framework-faq.aspx
Ответ 4
Насколько я понимаю, вы хотите создать экземпляр своей модели (через бит "новый 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;
Ответ 5
Есть один из моего сообщения, я ищу пару дней, чтобы сделать этот метод возможным.
Отдайте мне свой канал, но я думаю, что это поможет вам обновить EntityCollection