Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 实体框架未填充savechanges上的导航属性_Entity Framework_Asp.net Mvc 2_C# 4.0_Ninject - Fatal编程技术网

Entity framework 实体框架未填充savechanges上的导航属性

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

我目前正在尝试为报表编辑器构建一个web前端,允许用户创建基本上是文本字段的不同部分。我允许用户看到的第一个屏幕导致他们填充一些非常小的初始数据,我使用它生成一个新的报告表记录。我使用t4生成我的简单存储库:

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正在处理它们的实例化。我希望我知道一个更简单的方法来检查,但现在这是一个伟大的解决方案!谢谢