Downcasting con Entity Framework
Tengo un proyecto donde he definido en EF yEmployer
como una clase derivada deUser
. En mi proceso, creo un usuario sin saber si eventualmente será un empleador (u otro tipo de usuarios) y luego necesito convertirlo. Al principio lo intenté (Intellisense indicó que existe una conversión explícita):
Employer e = (Employer) GetUser();
pero en tiempo de ejecución obtuve:
Unable to cast object of type 'System.Data.Entity.DynamicProxies.User_7B...0D' to type 'Employer'.
so intenté escribir un convertidor:
public partial class User
{
public static explicit operator Employer(User u)
{
pero me sale el error:
Error 21 'User.explicit operator Employer(User)': user-defined
conversions to or from a derived class are not allowed
C:\Users\..\Documents\Visual Studio 2010\Projects\..\Website\Models\EF.Custom.cs
multa. Luego sobrecargué el constructor paraEmployer
Me gusta esto
public partial class Employer
{
public Employer(User u)
{
this.Id = u.Id;
this.Claims = u.Claims;
// etc.
}
}
y pensé que podría simplemente hacer:
Employer e = new Employer(GetUser());
pero cuando lo ejecuto me sale el error:
System.InvalidOperationException was unhandled by user code
Message=Conflicting changes to the role 'User' of the
relationship 'EF.ClaimUser' have been detected.
Source=System.Data.Entity
StackTrace:
[...]
at Controllers.AuthController.Register(String Company, String GivenName,
String Surname, String Title, String Department) in C:\Users\..\Documents\
Visual Studio 2010\Projects\..\Website\Controllers\AuthController.cs:line
como último recurso Intenté escribir esto:
Employer e = Auth.Claims("id")
.Where(x => x.Value == Auth.NameIdentifier())
.Select(x => x.User)
.Cast<Employer>()
.Single();
... GetUser () devuelve un objeto de tipoUser
que no ofrece el.Cast<>
así que utilicé una consulta directa para llegar allí ... pero aún recibo la excepción de conversión de objetos proxy dinámicos.
soy mi pregunta es: ¿cómo puedo bajar cuando el objeto tiene persistencia a través de EF?