2012-10-03 51 views
0

我相信我只是在這裏錯過了一些非常基本的東西,但我似乎無法想象它..也許是因爲它已經有一段時間了,因爲我一直在.NET平臺。ASP.NET MVC3 EF模型繼承無法隱式轉換類型

無論如何,我有這個數據庫結構我ASP.NET MVC3框架,我有「Coruse」,「工具」和「ToolADL」(從工具繼承)。一個「課程」可以有一個或多個「工具」,其中一個「工具」類型是「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:

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

AAAND的型號/ 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控制器詳細信息函數(和其他人)中獲取以下錯誤, ()「:

ToolADLController.Details(INT):

private ProjectContext db = new ProjectContext(); 
public ViewResult Details(int id){ 
    ToolADL tooladl = db.Tools.Find(id); 
    return View(tooladl); 
} 

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

(我改變了原單項目的名稱爲 」項目「)

我根本無法FIGUR什麼我我做錯了,是我嗎? t錯誤的類型,有些關於我遺漏的繼承或其他什麼的基礎知識?

希望某種靈魂能告訴我爲什麼我是一個白癡,不明白這一點:)

+0

好的,我做了一些假設,但是db.Tools.Find(id)在調試器中返回的對象類型是什麼? –

回答

1

如果由db.Tools.Find(id)返回的對象是ToolADL類型,那麼你應該做的:

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

之後,你會有你的對象或null。

如果是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和舊的C#。但非常感謝答案,我不知道這些東西! :) –