나는 EF에서 User
의 파생 클래스로 Employer
으로 정의한 프로젝트를 가지고 있습니다. 내 프로세스에서는 결국 사용자 (또는 다른 종류의 사용자)가 될지 여부를 모른 채 사용자를 생성하고 나중에 변환해야합니다. 처음에는 (인텔리가 명시 적 변환이 존재 표시) 시도 :Entity Framework로 다운 캐스팅
Employer e = (Employer) GetUser();
하지만 런타임에 내가 가지고 :
Unable to cast object of type 'System.Data.Entity.DynamicProxies.User_7B...0D' to type 'Employer'.
은 그래서 컨버터 쓰려고했습니다 :
public partial class User
{
public static explicit operator Employer(User u)
{
을하지만 오류 메시지 :
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
괜찮아. 나는 다음과 같은 Employer
의 생성자를 오버로드 :
public partial class Employer
{
public Employer(User u)
{
this.Id = u.Id;
this.Claims = u.Claims;
// etc.
}
}
을하고 난 후 바로 할 수있는 생각 :
Employer e = new Employer(GetUser());
하지만 난 그것을 실행할 때 오류 얻을 :
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
등을 최후의 수단으로이 글을 써 보았습니다.
Employer e = Auth.Claims("id")
.Where(x => x.Value == Auth.NameIdentifier())
.Select(x => x.User)
.Cast<Employer>()
.Single();
... GetUser()는 을 제공하지 않는 User
유형의 객체를 반환하므로 거기에 직접 쿼리를 사용했지만 동적 프록시 객체 예외는 여전히 발생합니다.
내 질문은 : 개체가 EF를 통해 지속성을 유지할 때 어떻게 다운 캐스트 할 수 있습니까?
은 EF 모델의 '고용주'부분입니까?상속을'TPH' 나'TPC'로 정확하게 매핑했다면 EF는 올바른 하위 클래스 프록시 인 – Eranga
@Eranga를 인스턴스화합니다. 예'Employer'는 EF 모델의 일부입니다. 그리고 나는 TPT를 사용하여'Users'라는 테이블과'Users_Employer'라는 테이블을 가지고 있습니다. – ekkis