Downcasting com Entity Framework
Tenho um projeto em que defini na EF umEmployer
como uma classe derivada deUser
. No meu processo, crio um usuário sem saber se ele será um empregador (ou outros tipos de usuários) e, posteriormente, preciso convertê-lo. No começo, tentei (o Intellisense indicou que existe uma conversão explícita):
Employer e = (Employer) GetUser();
mas em tempo de execução eu tenho:
Unable to cast object of type 'System.Data.Entity.DynamicProxies.User_7B...0D' to type 'Employer'.
ntão tentei escrever um converso
public partial class User
{
public static explicit operator Employer(User u)
{
mas recebo o erro:
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
bem. Em seguida, sobrecarreguei o construtor paraEmployer
como isso
public partial class Employer
{
public Employer(User u)
{
this.Id = u.Id;
this.Claims = u.Claims;
// etc.
}
}
e achei que eu poderia fazer:
Employer e = new Employer(GetUser());
mas quando o executo recebo o erro:
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, tentei escrever o seguinte:
Employer e = Auth.Claims("id")
.Where(x => x.Value == Auth.NameIdentifier())
.Select(x => x.User)
.Cast<Employer>()
.Single();
... GetUser () retorna um objeto do tipoUser
que não oferece o.Cast<>
então usei uma consulta direta para chegar lá ... mas ainda recebo a exceção de objetos de proxy dinâmic
ntão, minha pergunta é: como posso fazer downcast quando o objeto tem persistência através do E