ASP.NET MVC3 EF模型继承无法隐式转换类型

ASP.NET MVC3 EF模型继承无法隐式转换类型,asp.net,database,asp.net-mvc-3,inheritance,Asp.net,Database,Asp.net Mvc 3,Inheritance,我确信我只是缺少了一些基本的东西,但我似乎无法理解。。可能是因为我已经有一段时间没有使用.NET平台了 无论如何,我在ASP.NETMVC3框架中有这个数据库结构,其中有“Coruse”、“Tool”和“ToolADL”(从工具继承)。“课程”可以有一个或多个“工具”,其中一个“工具”类型是“ToolADL” 模型/课程.cs: public class Course { [Key] public int CourseID { get; set; } [Required

我确信我只是缺少了一些基本的东西,但我似乎无法理解。。可能是因为我已经有一段时间没有使用.NET平台了

无论如何,我在ASP.NETMVC3框架中有这个数据库结构,其中有“Coruse”、“Tool”和“ToolADL”(从工具继承)。“课程”可以有一个或多个“工具”,其中一个“工具”类型是“ToolADL”

模型/课程.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; }
}
型号/工具ADL.cs:

public class ToolADL : Tool {
    [Required]
    public string Image { get; set; }
}
aa和模型/项目上下文:

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; }
}
错误1无法隐式转换类型“Project.Models.Tool” 到“caREhab_社区.模型.工具ADL”。存在显式转换 (是否缺少演员阵容?)C:\Users\Thor\Documents\Visual Studio 2010\Projects\Project\Project\Project\ToolADLController.cs 29 31项目

(我将原始项目的名称改为“项目”)

我根本不知道我做错了什么,是错误的类型,我遗漏了一些关于继承的基本知识还是其他什么


希望一些善良的灵魂能告诉我为什么我是一个白痴并且不能弄明白这一点:)

如果由
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;
public class A 
{
    public static explicit operator B(A a)
    {
        return new B();
    }
}
这实际上是关于继承的一个基本事实。 您可以通过执行以下操作将此隐式转换更改为显式打开:

B b = (B)a;
然后您的代码将被编译,但您将得到一个运行时异常:

无法将类型“A”的对象强制转换为类型“B”

要使其工作,您必须指定如下显式转换:

A a = new A();
B b = a;
public class A 
{
    public static explicit operator B(A a)
    {
        return new B();
    }
}
但这将给您带来另一个编译时错误:

“A.explicit operator B(A)”:用户定义的与A之间的转换 不允许使用派生类


好的,我做了一些假设,但是
db.Tools.Find(id)
在调试器中返回的对象类型是什么?我们对数据结构进行了更改(由于另一个相关错误),之后该错误不再发生。。我不记得我们做错了什么,但我们的知识是在MVC3上排序,在C#上排序。但是非常感谢你的回答,我不知道这些东西中的一些!:)