0

我确定我只是在这里遗漏了一些非常基本的东西,但我似乎无法弄清楚......也许是因为我已经有一段时间没有使用 .NET 平台了。

无论如何,我在 ASP.NET MVC3 框架中有这个数据库结构,其中我有“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; }
}

模型/工具.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; }
}

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; }
}

现在,当我尝试创建控制器并连接到 DbContext 和模型到它以便实体框架可以发挥它的魔力时,我在 ToolADL 控制器详细信息函数(和其他函数)中收到以下错误,其中我使用“find()” :

ToolADLController.Details(int):

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

错误 1 ​​无法将类型“Project.Models.Tool”隐式转换为“caREhab_community.Models.ToolADL”。存在显式转换(您是否缺少演员表?) C:\Users\Thor\Documents\Visual Studio 2010\Projects\Project\Project\Project\ToolADLController.cs 29 31 Project

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

我根本无法弄清楚我做错了什么,是错误的类型,我遗漏了一些关于继承的基本知识还是其他什么?

希望有好心人能告诉我为什么我是个白痴而无法弄清楚这一点:)

4

1 回答 1

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;

然后你的代码会编译,但你会得到一个运行时异常:

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

要使其工作,您必须像这样指定显式转换:

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

但这会给您带来另一个编译时错误:

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

于 2012-10-03T23:53:45.513 回答