0

私はここでかなり基本的なものが欠けていると確信していますが、それを理解できないようです..おそらく私が.NETプラットフォームを使用してからしばらく経っていたためです。

とにかく、私はこのデータベース構造をASP.NET MVC3フレームワークに持っており、「Coruse」、「Tool」、「ToolADL」(ツールからの継承)があります。「コース」には、「ツール」タイプの1つが「ToolADL」である1つ以上の「ツール」を含めることができます。

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

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

aaおよび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とそれにモデルを接続し、エンティティフレームワークがその魔法を実行できるようにしようとすると、「find()」を使用するときに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

(元のプロジェクトの名前を「プロジェクト」に変更しました)

私は単に自分が間違っていることを理解することができません、それは間違ったタイプですか、私が省略した継承について本当に基本的なものですか、それとも何か他のものですか?

ある親切な魂が、なぜ私がばかで、これを理解できないのかを教えてくれることを願っています:)

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;

これは実際、継承に関する基本的な真実です。次のようにして、この暗黙的な変換を明示的な on に変更できます。

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 に答える