ASP.NET MVC3 EF模型继承不能隐式转换类型

时间:2012-10-03 21:54:39

标签: asp.net database asp.net-mvc-3 inheritance

我确信我在这里只是遗漏了一些非常基本的东西,但我似乎无法想出来......也许是因为我已经在.NET平台上待了一段时间。

无论如何,我有这个数据库结构我是ASP.NET MVC3框架,我有“Coruse”,“Tool”和“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 Models / 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);
}
  

错误1无法隐式转换类型'Project.Models.Tool'   到'caREhab_community.Models.ToolADL'。存在显式转换   (你错过了演员吗?)C:\ Users \ Thor \ Documents \ Visual Studio   2010 \ Projects \ Project \ Project \ Project \ ToolADLController.cs 29 31项目

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

我根本无法弄清楚我做错了什么,是不是错误的类型,一些关于遗传的遗嘱我遗漏了什么?

希望某种善良的灵魂可以告诉我为什么我是一个白痴而无法弄清楚这一点:)

1 个答案:

答案 0 :(得分: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)':用户定义的转换来自或来自   不允许派生类