2016-08-24 8 views
0

エンジニアとマネージャーのモデルは、人物モデルから継承します。人物モデルには、姓、名、人物IDが含まれています。変更モデルには、エンジニアやマネージャーのすべての詳細、ステータス、すべての遅延ロードがあります。2つのモデルの情報を別のモデルから継承できないのはなぜですか?

初期化子のシードデータを使用して以下のコードを試してみると、エンジニア列とマネージャー列は空白です。変更モデルで "EngineerId"の代わりに変数 "PersonId"を使用し、ManagerIdまたはEngineerIdを除外しない限り、そのユーザーの個人モデルの詳細にアクセスすることはできません。私は同じモデルから継承しているManagerも持っているので、EngineerIdを使用する必要があります。私は両方の名前がインデックスに表示する必要があります。 EngineerIdがEngineerモデルを参照していること、またはManagerIdがPersonから継承したManagerモデルを参照していることはわかりません。ですから、初期化中にIdをそこに置くと、そのIDが何を指しているのかを判断できないようです。私はこのアプリケーションでユーザーの単一のセットが欲しいので、私は継承を使用する必要があります。私は間違って何をしていますか?

StatusNameとSystemNameを表示しても何の問題もなく、index.cshtmlにエンジニアがPersonの一部であることを確認しても問題ありませんが、それは設定されているからです変更モデルのそのように。 EngineerIdとそれに関連するPersonIdの間には何らかの切断があります。ここで

は変更モデルです:

public class Change 
{ 
    [Key] 
    public int ChangeId { get; set; } 

    [Required(ErrorMessage = "Change description is required.")] 
    [Display(Name = "Change Description")] 
    public string ChangeDescription { get; set; } 

    [Required(ErrorMessage = "Change date is required.")] 
    [Display(Name = "Change Date")] 
    public DateTime ChangeDate { get; set; } 

    [Required(ErrorMessage = "Engineer name is required.")] 
    [Display(Name = "Engineer")] 
    public int EngineerId { get; set; } 

    [Required(ErrorMessage = "Status is required.")] 
    [Display(Name = "Status")] 
    public int StatusId { get; set; } 

    [Required(ErrorMessage = "Manager is required.")] 
    [Display(Name = "Manager")] 
    public int ManagerId { get; set; } 

    [Required(ErrorMessage = "System is required.")] 
    [Display(Name = "System")]   
    public int SystemDetailId { get; set; } 

    public virtual Engineer engineer { get; set; } 
    public virtual Status status { get; set; } 
    public virtual SystemDetail systemdetail { get; set; } 
    public virtual Manager manager { get; set; } 

} 

ここでは人のモデルがあります:

public class Person 
{ 
    [Key] 
    public int PersonId { get; set; } 

    [Required(ErrorMessage = "The First Name field is required.")] 
    [Display(Name = "First Name")] 
    [MaxLength(50)] 
    public string FirstName { get; set; } 

    [Required(ErrorMessage = "The Last Name field is required.")] 
    [Display(Name = "Last Name")] 
    [MaxLength(50)] 
    public string LastName { get; set; } 

    [NotMapped] 
    [Display(Name = "Name")] 
    public string FullName 
    { 
     get 
     { 
      return FirstName + " " + LastName; 
     } 
    } 

} 

ここで例えばエンジニアのモデルです:

public class Engineer : Person 
{ 
    public ICollection<Manager> managers { get; set; } 
} 

これは、インデックスが思い付くものですビューが変更コントローラーの作成から生成されたとき。

OHおよび変化コントローラ:

public class ChangeController : Controller 
    { 
     private ChangeContext db = new ChangeContext(); 

     // GET: Change 
     public ActionResult Index() 
     { 
      var changes = db.changes; 
      return View(changes.ToList()); 
     } 

    } 
+0

はあなたがPK持っていると、データベースにsetted FKますか? – Hadee

+0

@Hadee私はこのチュートリアルを視聴した後にアプリを作るための私の最初の努力です。あなたは主なキーですか? Personから継承したモデルを除くすべてのモデルに設定されています。おそらく私はEngineerIdとManagerIdをこれら2つのモデルに追加すべきでしょうか?問題はPersonIdを使用することです。 –

+0

データベースとpkとfkが設定されていますか?もしそうなら、データベースの最初のアプローチを使用しますか? – Hadee

答えて

0

Iは、データベースの最初のアプローチを取ることなく、溶液を考え出しました。これらの手順の両方に従わないと、カスケードエラーが発生するため、答えは2つの解決策でした。

第1のステップは、関連コントローラ(この場合は変更コントローラ)に「ForeignKey」注釈を追加することです。

 [Required(ErrorMessage = "Engineer name is required.")] 
     [Display(Name = "Engineer")] 
     [ForeignKey("engineer")] 
     public int EngineerId { get; set; } 

     [Required(ErrorMessage = "Manager is required.")] 
     [Display(Name = "Manager")] 
     [ForeignKey("manager")] 
     public int ManagerId { get; set; } 

第二のステップは、あなたのコンテキストモデルに次の行を追加することです:

modelBuilder.Conventions.Remove();

としては、鉱山で、以下に示す:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); 
    modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>(); 
} 
関連する問題