2017-01-10 10 views
0

免責事項;私はmvc nubです。 私はちょっと立ち往生しました。これは数日前と同じように機能しましたが、なぜそれが今ではないのか分かりません。問題は、サブクラスのデータを元に戻すことができず、「通常の」プロパティからのデータだけです。私はGlobal.asax内から5行を移入しており、テーブルReDayModelsはDB内にあります。キーはDBでもOKです。asp.net mvcはサブクラスから値を取得しなくなりました

編集:ReWeekModelとReDayModelの両方のテーブルにデータがあります。私はコードの最初のアプローチを使用しています。

私はこのDB持っている:

public class ReChronoDB : DbContext 
{ 
    public DbSet<ReWeekRowModel> WeekRows { get; set; }   
} 

を、これは私のDbSet行

public class ReWeekRowModel 
{ 
    public ReWeekRowModel() 
    { 
     CreatedDate = DateTime.Now; 
     Days = new List<ReDayModel>() 
     { 
      new ReDayModel {DayName = DayOfWeek.Monday}, 
      new ReDayModel {DayName = DayOfWeek.Tuesday}, 
      new ReDayModel {DayName = DayOfWeek.Wednesday}, 
      new ReDayModel {DayName = DayOfWeek.Thursday}, 
      new ReDayModel {DayName = DayOfWeek.Friday}, 
      new ReDayModel {DayName = DayOfWeek.Saturday}, 
      new ReDayModel {DayName = DayOfWeek.Sunday} 
     }; 
    } 

    public DateTime CreatedDate { get; private set; } 
    [Key] 
    public int Id { get; set; } 
    public string Name { get; set; } 
    [DisplayName("Week #"), Range(1, 53)] 
    public int WeekOfYear { get; set; } 
    [Range(2017,2075)] 
    public int Year { get; set; } 
    public List<ReDayModel> Days { get; set; } 
    public Priority Priority { get; set; } 
    public Status Status { get; set; } 
    public Category Category { get; set; } 
    public Responsible Responsible { get; set; } 
    public ResponseGroup ResponseGroup { get; set; } 
    public string CaseRef { get; set; } 
    [StringLength(75), DisplayName("Short Description")] 
    public string Description { get; set; } 
    public string Details { get; set; } 

} 

そしてここサブクラスです:

public class ReDayModel 
{ 
    [Key] 
    public int Id { get; set; } 
    public DayOfWeek DayName { get; set; } 
    public double Hours { get; set; } 
    public string Comments { get; set; } 
} 

そして最後に、ここでのコントローラがありますインデックスアクション。

public class ReChronoController : Controller 
{ 
    ReChronoDB _reChronoDb = new ReChronoDB(); 

    // GET: ReChrono 
    public ActionResult Index(string responsegroup = "", string responsible = "", int week = 0, int year = 0) 
    { 
     CultureInfo ciCurr = CultureInfo.CurrentCulture; 
     ViewBag.CurrentWeek = ciCurr.Calendar.GetWeekOfYear(DateTime.Now, CalendarWeekRule.FirstFourDayWeek, 
      DayOfWeek.Monday); 
     ViewBag.CurrentYear = ciCurr.Calendar.GetYear(DateTime.Today); 


     var model = _reChronoDb.WeekRows.ToList(); 

     // For dropdownlists 
     ViewBag.Years = _reChronoDb.WeekRows.Select(r => r.Year).Distinct(); 
     ViewBag.Weeks = _reChronoDb.WeekRows.Select(r => r.WeekOfYear).Distinct(); 

     var filteredmodel = ReChronoDomainLayer.FilteredWeekRows(model, responsegroup, responsible, week, year); 

     return View(filteredmodel); 
    } 
} 

「モデル」変数にマウスを置いてドリルダウンすると、行のDaysコレクションに値がありません。

編集:

SELECT 
[Extent1].[Id] AS [Id], 
[Extent1].[CreatedDate] AS [CreatedDate], 
[Extent1].[Name] AS [Name], 
[Extent1].[WeekOfYear] AS [WeekOfYear], 
[Extent1].[Year] AS [Year], 
[Extent1].[Priority] AS [Priority], 
[Extent1].[Status] AS [Status], 
[Extent1].[Category] AS [Category], 
[Extent1].[Responsible] AS [Responsible], 
[Extent1].[ResponseGroup] AS [ResponseGroup], 
[Extent1].[CaseRef] AS [CaseRef], 
[Extent1].[Description] AS [Description], 
[Extent1].[Details] AS [Details] 
FROM [dbo].[ReWeekRowModels] AS [Extent1] 

編集:ここで実行されているSQLがあり、これは文脈のですか?

public class ReChronoDBInitializer : 
    DropCreateDatabaseIfModelChanges<ReChronoDB> 
{ 
    protected override void Seed(ReChronoDB context) 
    { 
     base.Seed(context); 

     var enumToLookup = new EnumToLookup(); 

     enumToLookup.Apply(context); 

     ReChronoDomainLayer.CreateDummyEntries(context); 
    } 
} 

List Daysコレクションを完全に無視しているようです。

フィルタリングされたモデルを使用せずに試してみましたが、ここに残しました。そのため、アクションにパラメータがある理由を理解できます。

アイデア?

+0

どのようなEFにアプローチしていますか? DdContextも追加します。 ReDayModelテーブルにデータがありますか? –

+0

@M.Wiśnickicode first。 dbcontextを追加するとどういう意味ですか?ReWeekModelとReDayModelの両方のテーブルにデータがあります。 –

+0

'ReWeekRowModel'と' ReDayModel'の間に '1 *'(1対多)の関係があるようです。テーブルの外来キーは何ですか?このリンクをチェックしてください。 。私はあなたが 'public listに' virtual'キーワードを持っていないのでそれが疑わしいです。 Days {get;セット; } ' – coolboyjules

答えて

0

まずReDayModelも同様ReChronoDBの一部であることを確認してください。

public class ReChronoDB : DbContext 
{ 
    public DbSet<ReWeekRowModel> WeekRows { get; set; }  
    public DbSet<ReDayModel> DayRows { get; set; }  
} 

今すぐあなたのコントローラのアクションは、遅延ロードを使用しようとしたが、それが原因Daysプロパティに対して誤ったプロパティのタイプに無効になっています。場合

public class ReChronoController : Controller 
{ 
    ... 
    public ActionResult Index(string responsegroup = "", string responsible = "", int week = 0, int year = 0) 
    { 
     ... 
     var model = _reChronoDb.WeekRows.Include(w => w.Days).ToList(); 
     ... 
    } 
} 

:あなたは.Include()メソッドを使用するためにあなたの行動の変化を必要とする積極的なロードを使用することができます別の方法として

public class ReWeekRowModel 
{ 
    ... 
    public virtual ICollection<ReDayModel> Days { get; set; } 
    ... 
} 

を:あなたは、あなたのクラスは次のようになりますロード怠惰有効にしたい場合あなたは常にDaysコレクションが必要です。これにより、パフォーマンスが向上する可能性があります。詳しくはhereをお読みください。

+0

これは今動作しています。 ReDayModelをDbSetに入れる必要はありませんでした。私はIncludeを使う必要はなかった。ヘルプがデイズのコレクションを仮想化しているようだ。サイドノートは、デシジョンコレクションを仮想化したときに、コンストラクタ(理由はありません)のために複製されたReDayModelsを作成しました。Resharperは私に警告を与えました。あなたの答えが私を解決に導いたので、私はそれを解決してマークしています。ありがとう! –

関連する問題