2017-04-04 77 views
0

我在MapHeader和MapDetail表 之間有一對多的關係,因此可以有多個mapdetails單個地圖頭。 在數據庫中,表MapDetail具有映射到MapHeader表中的pk(MapHeaderId)的外鍵MapHeaderID。EntityFramework - 一對多關係

我在的EntityFramework它定義代碼優先如下:

public class MapHeader 
{ 
    public int MapHeaderID { get; set; } 
    .... 
    public virtual ICollection<MapDetail> mapDetails 
    { 
     get; 
     set; 
    } 
} 

public class MapDetail 
{ 
    public int MapDetailID { get; set; } 
    public int MapHeaderID { get; set; } 
    .... 
    public virtual MapHeader mapheader { get; set; } 
} 

FLUNETAPI

modelBuilder.Entity<MapDetail>() 
      .HasRequired<MapHeader>(md => md.mapheader) 
      .WithMany(mh => mh.mapDetails) 
      .HasForeignKey(md => md.MapHeaderID); 

它沒有鏈接!我mapdetail記錄/對象內的mapheader屬性仍然爲空...我做錯了什麼?

CODE - 寫在Razor視圖

foreach (MapDetail geMapDetail in Model.mapDetails) 
    { 
    if(...) 
    { 
     if(...){...} 
     else{ 
      <td> 
      foreach(..) 
      { 
       var term = geMapDetail.Term == 0 ? geMapDetail.mapheader.Term : geMapDetail.Term; 
      } 
      </td> 
     } 
    } 

以上geMapDetail.mapheader代碼崩潰,因爲mapheader是空

我的查詢是在存儲過程中

select distinct md.yearid, md.assessmentid, md.resulttypeid, 
    concat(ah.name, ' - ', a.name) as Name, md.term, md.semester, md.month, md.week, 
    md.MapDetailID, md.MapHeaderID, md.ColourFormatType, md.ResultTypeIDs, 
    md.RowOrder, md.Attendance, md.EffectSize, md.Growth, md.IndicatorID, 
    md.TeacherNameRequired, md.AllowEdit, md.PageHeaderID, md.IncludePreviousTerms, 
    md.IncludePreviousSemesters, y.year 
from mapdetail md 
left outer join assessments a on a.assessmentid = md.assessmentid 
left outer join assessments ah on ah.assessmentID = a.headerID 
left outer join years y on md.yearID = y.yearID 
left outer join assessmentresulttypes art on a.assessmentid = art.assessmentid 
left outer join resulttypes rt on rt.resulttypeid = art.resulttypeid 
where md.mapheaderid = 22; 

DBCONTEXT

public MapDetailResultSet Find_MapDetails(int mapHeaderId, int yearId, string classIds, int indicatorGroup, string indicatorIds) 
    { 
     var query = "CALL Find_MapDetails(@mapHeaderId, @yearId, @classIds, @indicatorGroup, @indicatorIds)"; 

     MySqlParameter[] mySqlParams = new MySqlParameter[] { new MySqlParameter("mapHeaderId", mapHeaderId), 
                   new MySqlParameter("yearId", yearId), 
                   new MySqlParameter("classIds", classIds), 
                   new MySqlParameter("indicatorGroup", indicatorGroup), 
                   new MySqlParameter("indicatorIds", indicatorIds) 
                  }; 

     MapDetailResultSet mapdetails = new MapDetailResultSet(); 

     using (var multiResultSet = DbContextExtensions.MultiResultSetSqlQuery(this, query, mySqlParams)) 
     { 
      mapdetails.mapDetails = multiResultSet.ResultSetFor<MapDetail>().ToList(); 
      //other result sets 
      ... 

     } 
    return mapdetails; 
    } 

我也曾經在禁用的DbContext惰性加載(沒有幫助)

public geContext(string connString):base(connString) 
    { 
     this.Configuration.LazyLoadingEnabled = false; 
     Database.SetInitializer(new MySqlInitializer()); 
    } 

UPDATE

select distinct md.yearid, md.assessmentid, md.resulttypeid, 
    concat(ah.name, ' - ', a.name) as Name, md.term, md.semester, md.month, md.week, 
    md.MapDetailID, md.MapHeaderID, md.ColourFormatType, md.ResultTypeIDs, 
    md.RowOrder, md.Attendance, md.EffectSize, md.Growth, md.IndicatorID, 
    md.TeacherNameRequired, md.AllowEdit, md.PageHeaderID, 
    md.IncludePreviousTerms, 
    md.IncludePreviousSemesters, y.year 
    from mapdetail md 
    left outer join assessments a on a.assessmentid = md.assessmentid 
    left outer join assessments ah on ah.assessmentID = a.headerID 
    left outer join years y on md.yearID = y.yearID 
    left outer join assessmentresulttypes art on a.assessmentid = art.assessmentid 
    left outer join resulttypes rt on rt.resulttypeid = art.resulttypeid 
    left outer join mapheader mh on mh.mapheaderID = md.mapheaderID 
    where md.mapheaderid = 22; 
+0

你在MapDetail表允許空? –

+0

沒有我mapheaderid在mapdetail有一個值22可以在mapheader表中找到 – Samra

+0

我使用存儲過程,雖然加載mapdetail這應該不是問題,我相信 – Samra

回答

0

不是理想的做法,但它讓我無論如何。 我裝從資源庫中的特定mapheader,然後在列表填充每個mapdetail對象手動

控制器

MapHeaderRepository repMapHeader = new MapHeaderRepository("name=ge"); 
    MapDetailsRepository repMapDetail = new MapDetailsRepository("name=ge"); 

    MapDetailResultSet mapDetailResultSet = repMapDetail.FindMapDetails(mapHeaderId, yearId, classIds, 
                indicatorGroup, indicatorIds); 
    var mapHeader = repMapHeader.Get(22); 

    foreach (MapDetail md in mapDetailResultSet.mapDetails) 
    { 
     md.mapheader = mapHeader; 
    } 
1

這工作得很好,我只是你的模型類。您甚至不需要FluentAPI代碼,因爲您的類定義遵循Code-First外鍵慣例。我用這些模型類:

public class MapHeader 
{ 
    public int MapHeaderId { get; set; } 

    public virtual List<MapDetail> MapDetails { get; set; } 
} 

public class MapDetail 
{ 
    public int MapDetailId { get; set; } 

    public int MapHeaderId { get; set; } 
    public virtual MapHeader MapHeader { get; set; } 
} 

然後我寫了一個簡單的命令行程序,以節省一些數據,並從數據庫中讀出來:

private static void InsertMapHeader() 
{ 
    var header = new MapHeader 
    { 
     MapDetails = new List<MapDetail> 
     { 
      new MapDetail(), 
      new MapDetail(), 
      new MapDetail(), 
      new MapDetail() 
     } 
    }; 

    using (var context = new BreakAwayContext()) 
    { 
     context.MapHeaders.Add(header); 
     context.SaveChanges(); 
    } 
} 

private static void ReadMapDetails() 
{ 
    using (var context = new BreakAwayContext()) 
    { 
     var detail = context.MapDetails.FirstOrDefault(); 
     Console.WriteLine("Header id: {0}", detail.MapHeader.MapHeaderId); 
    } 
} 

這段代碼獲得第一MapDetail並遵循導航屬性映射到MapHeader。所有這些工作都沒有問題,因爲Code-First在請求時使用延遲加載來獲取MapHeader導航屬性。

如果你想急切地加載相關屬性,你可以改變你的查詢中使用的方法包括加入MapHeaders表,就像這樣:

var detail = context.MapDetails.Include(d => d.MapHeader).FirstOrDefault(); 

你還沒有帶出您的代碼查詢(可能在您的Control類中),所以很難說出確切的問題。

+0

pedro我也添加了我的查詢這個查詢在存儲過程中 – Samra

+0

調用代碼也被添加了 – Samra

+0

我在結果集中找不到Include方法EF v 6.1.3 – Samra