Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.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
C# EF代码WPF应用程序中使用的第一个对象图内存_C#_Wpf_Memory Management_Entity Framework 4.1_Ef Code First - Fatal编程技术网

C# EF代码WPF应用程序中使用的第一个对象图内存

C# EF代码WPF应用程序中使用的第一个对象图内存,c#,wpf,memory-management,entity-framework-4.1,ef-code-first,C#,Wpf,Memory Management,Entity Framework 4.1,Ef Code First,我正在构建一个应用程序来显示源代码管理存储库中更改的历史日志。该应用程序首先在.NET4WPF和实体框架代码中实现 我遇到的一个问题是,随着时间的推移,随着越来越多的日志条目被添加到日志中,应用程序会使用越来越多的内存,并且不会释放对日志条目的引用。每个日志条目都包含一个“更改的文件”列表,对于每个更改的文件,都包含文件的前后版本 UI显示日志条目列表以及当前选定的LogEntry和ChangedFile的新旧版本之间的差异。数据模型大致如下: public class LogSubscript

我正在构建一个应用程序来显示源代码管理存储库中更改的历史日志。该应用程序首先在.NET4WPF和实体框架代码中实现

我遇到的一个问题是,随着时间的推移,随着越来越多的日志条目被添加到日志中,应用程序会使用越来越多的内存,并且不会释放对日志条目的引用。每个日志条目都包含一个“更改的文件”列表,对于每个更改的文件,都包含文件的前后版本

UI显示日志条目列表以及当前选定的
LogEntry
ChangedFile
的新旧版本之间的差异。数据模型大致如下:

public class LogSubscription
{
    public List<LogEntry> Log { get; set; }
}

public class LogEntry
{
    public List<ChangedFile> ChangedFiles { get; set; }
}

public class ChangedFile
{
    public string OldVersion { get; set; }
    public string NewVersion { get; set; }
}
公共类日志订阅
{
公共列表日志{get;set;}
}
公共类日志条目
{
公共列表更改文件{get;set;}
}
公共类变更文件
{
公共字符串旧版本{get;set;}
公共字符串NewVersion{get;set;}
}
当我首先使用EF代码时,只需访问列表属性即可查询数据库并自动构建对象模型。我想做的是在一定时间后以某种方式取消引用
ChangedFiles
列表,并根据需要重新查询数据库和重建对象模型(即,用户已单击返回日志条目)

有没有办法先用EF代码来实现这一点?或者我应该采取不同的方法来控制使用的内存


应用程序和完整的源代码托管在GitHub上,如下所示:

如评论中所述:这可能发生在一个从未处理过的静态上下文中。我在源代码中看到,有一个
ThreadStaticContextBackground
LogEntry
使用:在类似于模式的活动记录中,
LogEntry
通过其
MarkAsReadAndSave
方法保存自己,它需要一个上下文


您可能这样做(我没有仔细检查源代码)是为了防止在保存日志条目时创建和处理许多上下文。但我认为你应该重新考虑主动记录方法。日志条目由
MainWindowViewModel
保存。视图模型应调用一种服务方法,该方法通过短期上下文保存日志条目,并可能缓存条目以使其可用于显示等。视图模型应从
dLogSelectionChanged
接收
RemovedItems
集合,以便由一个上下文而不是每个条目一个上下文来处理它们。这有什么意义吗?

如果您对应用程序使用单个上下文实例,它将保留对加载实体的所有引用,直到您手动分离它们或释放上下文实例。谢谢@LadislavMrnka。在处理上下文时,是否基本上不能使用延迟加载?我想这是我感到困惑的地方,也是我以前遇到问题的地方。谢谢@Gert的反馈。我想问题是我能在没有静态上下文引用的情况下进行延迟加载吗?如果我不持有静态引用,我将如何延迟加载和卸载ChangeFiles集合?任何文章的链接都将不胜感激-我在卸载问题上找不到太多。。谢天谢地,在没有上下文的情况下,您不能进行延迟加载,但也许您应该拥有在需要时提供数据的服务方法,而不是依赖对象的导航属性。因此,卸载会更容易:只需清空或处置一个集合变量。是的,这很有意义。快速问题-如果我清空集合属性,然后保存父实体,这会删除集合中的实体吗?你能告诉我这种行为有什么例子吗?谢谢如果您加载一个集合,然后将其清除,yes EF会将其视为删除实体或至少中断与父对象的关联的请求。见例。