2016-07-18 13 views
0

エンティティフレームワークのコードを最初に学習したいが、問題を解決できない。 私は、コントローラ(AnimeDbContextを使用してフォームモデルクラスアニメ)を作成したい 私はエラーImage Of ErrorC#エンティティフレームワークコード最初にコントローラを作成

を持って、私はそれが外部キーを持ついくつかの問題であることがわかりますが、私はなぜ知りません。ここ は、クラスのアニメのコードである

namespace MyBD.Models 
{ 
    [Table("Anime")] 

    public class Anime 
    { 


     [Key] // ustawiamy klucz główny tabeli 
     public int Id { get; private set; } 
     [Required] 
     public string Title { get; private set; } 
     public string Description { get; private set; } 

     public Anime(int id=0, string title="New", string description="Description") 
     { 
      this.Id = id; 
      this.Title = title; 
      this.Description = description; 
     } 



     public virtual ICollection<CommentAnime> Comments { get; set; } 


    } 

} 

とクラスAnimeComment私が見つけたエンティティフレームワークでは

namespace MyBD.Models 
{ 
    [Table("CommentAnime")] 
    public class CommentAnime 
    { 
     [Key] 
     public int Id { get; private set; } 
     [ForeignKey("anime")] // ustawiamy klucz obcy 
     [Required] 
     public int AnimeId { get; set; } 
     public string Opinion { get; private set; } 
     public int Mark { get; private set; } 

     public CommentAnime(int id=0, string opinion="My Opinion", int mark=0) 
     { 
      this.Id = id; 
      this.Opinion = opinion; 
      this.Mark = mark; 
     } 

     public virtual Anime anime { get; set; } 
+0

私は例外画像を見ることができませんあなたは質問に追加されますか? –

答えて

0

そのクラス内のすべてのプロパティは大文字でも小文字で「ID」、呼び出された場合、 "ID"または "id"を指定すると、それがプライマリキーとして参照されます。したがって、[Key]データ注釈は必要ありません。

EFはデフォルトでテーブル名のクラス名を使用するため、[Table()]データ注釈は必要ありません。

ビューを使用してプレースホルダテキストを設定できるため、パブリックコンストラクタを配置する必要もありません。作成された日付の設定などのデフォルト値のデフォルトコンストラクタを使用できます。たとえばAnimeクラスを参照してください。

新しいクラスについては下記をご覧ください。

public class Anime 
{ 
    public Anime() 
    { 
     Description = "This is a desciption"; 
     DateCreated= DateTime.UtcNow; 

    } 

    public int Id { get; set; } 
    [Required] 
    public string Title { get; set; } 
    public string Description { get; set; } 
    public DateTime DateCreated { get; set; }  


    public virtual ICollection<CommentAnime> Comments { get; set; } 


} 

仮想して、もう一度「名前ID」EFを使用して、自動的にあなたのためにそれをうまくいくようやって、親テーブルを参照することにより、EFに参加します。

public class CommentsAnime 
{ 
    public int Id { get; set; } 
    public int AnimeId { get; set; } //Using the virtual table name 
    public string Opinion { get; private set; } 
    public int Mark { get; private set; } 

    public virtual Anime Anime { get; set; } 

} 
1

フィリップスの回答は、モデルで必要な変更のほとんどを既にカバーしています。私はそれ以上のことを行い、FluentAPIを使用してdbContextクラスを設定する方法を提供したいだけです。

アニメクラス::

public class Anime 
{ 
    public int Id { get; set; } 
    public string Title { get; set;} 
    public string Description { get; set; } 

    public virtual ICollection<CommentAnime> Comments { get; set; } 
} 

public class CommentAnime 
{ 

    public int Id { get; set; } 
    public string Opinion { get; set; } 
    public int Mark { get; set; } 

    public int AnimeId { get; set; } 
    public virtual Anime anime { get; set; } 
} 

AnimeDbContextクラス

//Program Table 
//Title Field 
modelBuilder.Entity<Anime>() 
      .Property(t => t.Title) 
      .HasColumnType("varchar") 
      .HasMaxLength(120) //define some Length.. 
      .IsRequired(); //Will be translated as Not Null 


//CommentAnime 
//Opinion Field 
modelBuilder.Entity<CommentAnime>() 
      .Property(t => t.Opinion) 
      .HasColumnType("varchar") 
      .HasMaxLength(120) //define some Length.. 
      .IsRequired(); //Will be translated as Not Null 


//Configuring the One-to-Many Relationship 

modelBuilder.Entity<CommentAnime>() 
      .HasRequired(t => t.Anime) 
      .WithMany(x => x.Comments) 
      .HasForeignKey(t => t.AnimeId); 

あなたはCommentAnimeでNULL可能ForeinKeyを持っているしたい場合は、データアノテーションは、あなたのクラスに属性をスキップすることができますこの方法HasRequiredの代わりにHasOptionalを使用できます。 EFを使用しているため、Id列の設定を作成する必要はありません。naming conventions

このようにして、POCOクラスは任意のEF構成から独立しています。すべてのデータベースモデリングは、AnimeDbContextクラスで集中管理されています。私は個人的には、あなたが属性を使ってクラスを徹底的に評価するのを避けるため、これが最良のアプローチであると考えていますが、これは単なる個人的なことだと思います。

関連する問題