2012-10-03 1 views
0

저는 여기에 꽤 기본적인 몇 가지를 놓친 것 같습니다. 그러나 그것을 설명 할 수는 없습니다. .NET 플랫폼.ASP.NET MVC3 EF 모델 상속 암시 적으로 형식을 변환 할 수 없습니다

어쨌든이 데이터베이스 구조는 "Coruse", "Tool"및 "ToolADL"(Tool에서 상속)이있는 ASP.NET MVC3 프레임 워크입니다. "코스"는 "도구"유형 중 하나가 "ToolADL"인 하나 이상의 "도구"를 가질 수 있습니다.

모델/Course.cs :

public class Course { 
    [Key] 
    public int CourseID { get; set; } 

    [Required(ErrorMessage = "{0} er påkrævet")] 
    [Display(Name = "Værktøj")] 
    public virtual ICollection<Tool> Tools { get; set; } 
} 

모델/Tool.cs :

public abstract class Tool { 
    public Tool(){ 
     Priority = 0; 
    } 
    [Key] 
    public int ToolID { get; set; } 

    [Required] 
    public int CourseID { get; set; } 

    [Required] 
    public int Priority { get; set; } 
} 

모델/ToolADL.cs : 모델 aaand

public class ToolADL : Tool { 
    [Required] 
    public string Image { get; set; } 
} 

/ProjectContext :

public class ProjectContext : DbContext { 
    // Course context 
    public DbSet<Course> Courses { get; set; } 

    // Tools 
    public DbSet<Tool> Tools { get; set; } 

    // ToolADL 
    public DbSet<ToolADL> ToolADLs { get; set; } 
} 

컨트롤러를 만들고 DbContext와 모델에 연결하여 엔티티 프레임 워크가 마술을 할 수있게 만들 때 ToolADL 컨트롤러 세부 정보 함수 (및 기타)에서 다음과 같은 오류가 발생합니다. "find() 나는 단순히 내가 무엇을 아웃으로 나뉘어진다 수 없습니다

"(프로젝트"

ToolADLController.Details (INT)는

Error 1 Cannot implicitly convert type 'Project.Models.Tool' to 'caREhab_community.Models.ToolADL'. An explicit conversion exists (are you missing a cast?) C:\Users\Thor\Documents\Visual Studio 2010\Projects\Project\Project\Project\ToolADLController.cs 29 31 Project

private ProjectContext db = new ProjectContext(); 
public ViewResult Details(int id){ 
    ToolADL tooladl = db.Tools.Find(id); 
    return View(tooladl); 
} 
가 나는 orginal 한 프로젝트의 이름을 변경 ") 잘못하고있다, 나는이다. 틀린 타입들, 내가 배제한 상속 또는 다른 것에 대한 기본적인 것들이 있는가? 내가 바보 오전 db.Tools.Find(id)에 의해 반환되는 객체 타입 ToolADL 인 경우 :

+0

좋아, 나는 몇 가지 가정을했지만'db.Tools.Find (id)'가 디버거에서 반환하는 객체의 유형은 무엇입니까? –

답변

1

을이 알아낼 수없는 이유 어떤 종류의 영혼이 말해 줄 수

희망 당신은 수행해야합니다

ToolADL tooladl = db.Tools.Find(id) as ToolADL; 

그 후 당신은 당신의 개체 또는 널거야.

이 유형 ToolADL의 아니라면 때문에 당신은이 작업을 수행 할 수 있습니다 : 당신이있을 때

:

public class A { } 
public class B : A { } 
당신이 뭔가를 할 수 없습니다

:

A a = new A(); 
B b = a; 

이를 사실 상속에 관한 기본적인 진리입니다.

B b = (B)a; 

그런 다음 코드를 컴파일 할 것입니다하지만 당신은 런타임 예외 얻을 것입니다 : 당신은 수행하여 명시 적으로이 암시 적 변환을 변경 될 경우가 있습니다

Unable to cast object of type 'A' to type 'B'.

는 당신이를 지정해야 작동하게하려면를 이 같은 명시 적 변환 :

public class A 
{ 
    public static explicit operator B(A a) 
    { 
     return new B(); 
    } 
} 

그러나 이것은 당신에게 또 다른 컴파일 타임 오류를 줄 것이다 :

'A.explicit operator B(A)': user-defined conversions to or from a derived class are not allowed

+0

우리는 데이터 구조를 변경했습니다 (다른 관련 오류로 인해). 이후에 오류가 더 이상 발생하지 않았습니다. 우리가 잘못한 것을 기억하지 못합니다. 그러나 MVC3 및 이전 버전을 정렬하는 것은 우리의 지식에 의한 것입니다. 기음#. 하지만 답에 너무 고마워, 나는이 물건의 일부를 몰랐다! :) –

관련 문제