【发布时间】:2015-06-25 05:11:12
【问题描述】:
我正在 WPF 中开发一个食谱窗口应用程序,它由一个窗口和几个用户控件组成,这些用户控件使用来自 MVVM Light 的消息相互替换为 relayCommands。
应用程序使用从 entityFramework 生成的数据库。除了第一次执行文件之外,出现的问题是程序显示了许多警告和错误,例如:
Warning 1 Could not copy "...\cookbook\Cookbook.Services\Database1.mdf" to "bin\Debug\Database1.mdf". Beginning retry 1 in 1000ms. The process cannot access the file '...\cookbook\Cookbook.Services\Database1.mdf' because it is being used by another process. Cookbook.Services
在 ViewModelLocator 我有这个:
public ViewModelLocator()
{
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
SimpleIoc.Default.Register<MainWindowViewModel>();
SimpleIoc.Default.Register<MainViewModel>();
SimpleIoc.Default.Register<FoodTypeViewModel>();
SimpleIoc.Default.Register<ShoppingCartViewModel>();
SimpleIoc.Default.Register<MenuViewModel>();
SimpleIoc.Default.Register<MenuListViewModel>();
SimpleIoc.Default.Register<MenuCalendarViewModel>();
SimpleIoc.Default.Register<ChooseFoodWindowViewModel>();
}
我用来切换用户控件的消息也在创建新的 ViewModel 实例,例如:
BackToMainCommand = new RelayCommand(() =>
{
Messenger.Default.Send<ViewModelBase>(new MainViewModel());
},
() => true);
我玩弄了 ViewModel 以使它们成为单例,以确保系统中只有单个副本,但 SimpleIoc 需要公共构造函数来注册。而且我不知道这是否会帮助我解决问题。另外我没有告诉你的是 ViewModelLocator 仅在 xaml 中使用,所以我什至没有它的实例来清理这些东西。 (可能是我用错了但是不知道怎么用)
问题是我不知道如何以及在哪里清理所有 ViewModel,因为它们是在我提到的许多地方创建的,其中一些可能保存 *.mdf 文件。
【问题讨论】:
-
为您正在运行/调试的应用程序创建的进程 (1) 尚未完成,或 (2) 未关闭与数据库文件的所有连接。所以如果你再次构建它,它的文件句柄仍然是打开的,你不能复制打开的文件。请注意,调试时,特别是如果您使用“停止调试”按钮停止调试会话,调试过程不会直接终止。退出 Visual Studio 并重新启动它通常可以解决此问题。
-
嗯,这些连接位于一些使用数据库服务的 ViewModel 中。我认为那些 ViewModel 被定位器或消息所控制(如果我没记错的话)。我知道重新启动 Visual Studio 可以解决这个问题,但我需要修复它,这样我才能拥有工作的应用程序,因为即使我使用退出按钮或窗口中的十字退出应用程序也会发生这种情况。
标签: c# wpf entity-framework mvvm viewmodellocator