2011-11-03 102 views
1

我目前正在嘗試構建報表編輯器的Web前端,它允許用戶創建基本上是文本字段的不同部分。我允許用戶看到的第一個屏幕會導致它們填充一些非常小的初始數據,然後使用它創建新的Report表記錄。我使用的是T4生成我的簡單的數據存儲:當他們添加新的部分實體框架不填充savechanges上的導航屬性

public Entities.Result Add(ref ReportSection entity) { 

      Entities.Result result; 

      try { 

       this.Context.ReportSections.AddObject(entity); 

       this.Context.SaveChanges(); 

       result = new Entities.Result { 
        Success = true, 
        Messages = new List<Entities.ResultMessage>() 
       }; 

      } catch (System.Exception ex) { 

       this.EventLogger.Error(ex); 

       List<Entities.ResultMessage> messages = new List<Entities.ResultMessage>(); 

       messages.Add(new Entities.ResultMessage { Message = ex.ToString(), MessageSeverity = 10 }); 

       result = new Entities.Result { 
        Success = false, 
        Messages = messages 
       }; 

      } 

      return result; 
     } 

我在的形式把這種從索引控制器

public Entities.Result Add(ref Report entity) { 

      Entities.Result result; 

      try { 

       this.Context.Reports.AddObject(entity); 

       this.Context.SaveChanges(); 

       result = new Entities.Result { 
        Success = true, 
        Messages = new List<Entities.ResultMessage>() 
       }; 

      } catch (System.Exception ex) { 

       this.EventLogger.Error(ex); 

       List<Entities.ResultMessage> messages = new List<Entities.ResultMessage>(); 

       messages.Add(new Entities.ResultMessage { Message = ex.ToString(), MessageSeverity = 10 }); 

       result = new Entities.Result { 
        Success = false, 
        Messages = messages 
       }; 

      } 

      return result; 
     } 

,同樣的事情:

Report newReport = new Report() { 
       ApprovalDate = null, 
       Approver = string.Empty, 
       Author = System.Web.Security.Membership.GetUser().UserName, 
       Created = DateTime.Now, 
       IsActive = true, 
       IsSubmitted = false, 
       ReleaseDate = null, 
       SerialNumber1 = string.Empty, 
       SerialNumber2 = string.Empty 
      }; 

      var result = this._reportRepository.Add(ref newReport); 

這經歷得很好,我得到了數據庫中的記錄。然後我去他們的一些條目填入像這樣一個初始ReportSection對象:

var newSection = new ReportSection { 
        DisplayOrder = 1, 
        ReportId = newReport.Id, 
        ReportSectionTypeId = 1, 
        SectionText = title 
       }; 
var r = this._reportSectionRepository.Add(ref newSection); 

你會發現,我指的是newReport.Id在那裏,所以我有有效的ID從存儲庫中添加方法返回。 add方法部分向我返回一個有效的newSection對象,它有一個有效的ID,當我檢入它存在的db時。但是,EF並未在newSection.Report上填充導航屬性,這讓我可以在兩者之間得到。這就是我想弄明白的,爲什麼不能訪問?我有一個臨時解決方案,它會破壞我的一些DAL驗證邏輯,但我可以加載Report對象,然後通過Report.ReportSections添加ReportSection,然後在執行ApplyCurrentValues的repo上調用更新方法。

一些詳細信息: Visual Studio 2010中 C#.NET 4.0 MVC 2.0 EF 4.0(或者4.1) 我使用Ninject填寫庫:

Bind<IReportRepository>().To<ReportRepository>().WithConstructorArgument("connectionString", 
     ConfigurationManager.ConnectionStrings["ConnString"].ConnectionString); 

回答

1

你直接能設置導航屬性,而不是外鍵屬性:

var newSection = new ReportSection { 
    DisplayOrder = 1, 
    Report = newReport, 
    ReportSectionTypeId = 1, 
    SectionText = title 
}; 

如果_reportRepository_reportSectionRepository一個上下文重新相同,並且newReport仍然附屬於它,這就是你需要做的。

如果環境不newReport沒有連接到上下文相同或者,您必須將newReport第一上下文:

public Entities.Result Add(ref ReportSection entity) { 
    Entities.Result result; 
    try { 
     this.Context.Reports.Attach(entity.Report); 
     this.Context.ReportSections.AddObject(entity); 
     this.Context.SaveChanges(); 

     // etc. 
+0

只是去嘗試第一種方法,它的工作!我不知道,如果背景是相同的,因爲ninject是處理自己的實例。我希望我知道一個更簡單的方法來檢查,但現在這是一個很好的解決方案!謝謝。 – SenseiHitokiri