university tutorial mvc how framework first example español contoso code c# .net entity-framework

c# - tutorial - mvc entity framework español



Cómo relacionar objetos de contextos múltiples utilizando Entity Framework (5)

Soy muy nuevo en el marco de la entidad, así que tengan paciencia conmigo ...

¿Cómo puedo relacionar dos objetos de diferentes contextos?

El siguiente ejemplo arroja la siguiente excepción:

System.InvalidOperationException: la relación entre los dos objetos no se puede definir porque están unidos a diferentes objetos 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; }

Usar un contexto no es una opción porque estamos usando EF en una aplicación ASP.NET.


Deberá usar el mismo contexto (puede pasar el contexto al método getdefaultrole) o repensar las relaciones y extender la entidad.

EDITAR: Quería agregar que esto era para el ejemplo proporcionado, el uso de asp.net requerirá que pienses por completo en tu contexto y tus diseños de relación.

Simplemente podría pasar el contexto ... 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; }


Hay uno de mis mensajes , busco un par de días para hacer posible este método.

Devuélveme tu feed pero creo que eso podría ayudarte a actualizar tu EntityCollection


Otro enfoque que puede usar aquí es separar objetos de un contexto y luego adjuntarlos a otro contexto. Eso es un truco, y puede no funcionar en tu situación, pero podría ser una opción.

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(); }


Por lo que entiendo, quiere crear una instancia de su modelo (a través del "nuevo bit de XXXXEntidades ()") tan raramente como sea posible. Según MS ( http://msdn.microsoft.com/en-us/library/cc853327.aspx ), se trata de un golpe de rendimiento bastante sustancial. Así que envolverlo en una estructura using () no es una buena idea. Lo que he hecho en mis proyectos es acceder a él a través de un método estático que siempre proporciona la misma instancia del contexto:

private static PledgeManagerEntities pledgesEntities; public static PledgeManagerEntities PledgeManagerEntities { get { if (pledgesEntities == null) { pledgesEntities = new PledgeManagerEntities(); } return pledgesEntities; } set { pledgesEntities = value; } }

Y luego lo recupero así:

private PledgeManagerEntities entities = Data.PledgeManagerEntities;