Entity framework 实体框架未填充savechanges上的导航属性
我目前正在尝试为报表编辑器构建一个web前端,允许用户创建基本上是文本字段的不同部分。我允许用户看到的第一个屏幕导致他们填充一些非常小的初始数据,我使用它生成一个新的报告表记录。我使用t4生成我的简单存储库:Entity framework 实体框架未填充savechanges上的导航属性,entity-framework,asp.net-mvc-2,c#-4.0,ninject,Entity Framework,Asp.net Mvc 2,C# 4.0,Ninject,我目前正在尝试为报表编辑器构建一个web前端,允许用户创建基本上是文本字段的不同部分。我允许用户看到的第一个屏幕导致他们填充一些非常小的初始数据,我使用它生成一个新的报告表记录。我使用t4生成我的简单存储库: public Entities.Result Add(ref Report entity) { Entities.Result result; try { this.Context.Reports.Add
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;
}
Bind<IReportRepository>().To<ReportRepository>().WithConstructorArgument("connectionString",
ConfigurationManager.ConnectionStrings["ConnString"].ConnectionString);
这一切都很顺利,我得到了数据库中的记录。然后,我将它们的一些条目填充到初始ReportSection对象中,如下所示:
var newSection = new ReportSection {
DisplayOrder = 1,
ReportId = newReport.Id,
ReportSectionTypeId = 1,
SectionText = title
};
var r = this._reportSectionRepository.Add(ref newSection);
您会注意到我在这里引用了newReport.Id,因此我从repository add方法返回了有效的Id。section add方法向我返回一个有效的newSection对象,该对象具有有效的ID,当我签入db时,它就存在了。但是,EF并没有填充newSection.Report上的导航属性,这使我能够在两者之间进行切换。这就是我想弄明白的,为什么这是不可访问的?我有一个临时解决方案,它会破坏一些DAL验证逻辑,但我可以加载Report对象,然后通过Report.ReportSections添加ReportSection,然后在执行ApplyCurrentValues的repo上调用更新方法
更详细一点:
VisualStudio2010
C#.Net 4.0
MVC2.0
EF 4.0(或可能是4.1)
我正在使用Ninject填充存储库:
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;
}
Bind<IReportRepository>().To<ReportRepository>().WithConstructorArgument("connectionString",
ConfigurationManager.ConnectionStrings["ConnString"].ConnectionString);
Bind().To().WithConstructorArgument(“connectionString”,
ConfigurationManager.ConnectionString[“ConnString”].ConnectionString);
您可以直接设置导航属性而不是外键属性:
var newSection = new ReportSection {
DisplayOrder = 1,
Report = newReport,
ReportSectionTypeId = 1,
SectionText = title
};
如果\u reportRepository
和\u 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.
您可以直接设置导航属性而不是外键属性:
var newSection = new ReportSection {
DisplayOrder = 1,
Report = newReport,
ReportSectionTypeId = 1,
SectionText = title
};
如果\u reportRepository
和\u 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.
刚刚尝试了第一种方法,它成功了!我不确定上下文是否相同,因为ninject正在处理它们的实例化。我希望我知道一个更简单的方法来检查,但现在这是一个伟大的解决方案!谢谢。刚刚尝试了第一种方法,效果很好!我不确定上下文是否相同,因为ninject正在处理它们的实例化。我希望我知道一个更简单的方法来检查,但现在这是一个伟大的解决方案!谢谢