2011-11-03 95 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