如何正确移动 .mdf 文件的位置并相应地更改连接字符串数据目录
How to correctly move location of .mdf file and change Connection String's DataDirectory accordingly
目前我的 SQL 数据库在
C:\Users\Slaven\KasaMP.mdf
我想将它移动到我的项目目录 [也许 "database" 文件夹 (?)] 并正确更改我的连接字符串。 我的目标是能够在任何计算机上打开这个带有 .mdf 文件的项目。我使用的当前 ConnectionString 是 EntityFramework 生成的,我不确定使这个 CS 指向不同位置的方法是什么。
连接字符串:
<connectionStrings>
<add name="KasaMPEntities" connectionString="metadata=res://*/OsnovniPodaci.Model.csdl|res://*/OsnovniPodaci.Model.ssdl|res://*/OsnovniPodaci.Model.msl;provider=System.Data.SqlClient;provider connection string="data source=(localdb)\v11.0;AttachDbFilename=|DataDirectory|\KasaMP.mdf;initial catalog=KasaMP;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework""
providerName="System.Data.EntityClient" />
</connectionStrings>
我的项目路径:
C:\Users\Slaven\Documents\visual studio 2013\Projects\PCKasa\KasaMP
我在其他帖子中发现了下面这行,但我不确定它的作用:
AppDomain.CurrentDomain.SetData("DataDirectory", System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Database"));
我知道我必须将此属性放在 ConnectionString 中的某处
AttachDbFileName=|DataDirectory|\KasaMP.mdf
关于如何正确执行此操作的任何建议? ^ ^
在 WinForms 应用程序中,DataDirectory 替换字符串指向应用程序启动的文件夹。在 Visual Studio 会话的情况下,此文件夹是 BIN\DEBUG 或 BIN\RELEASE 文件夹(可能具有 x86 变体)
这在 Visual Studio 中运行良好,但您应该知道,在您的客户 PC 中并且不更改配置设置的情况下,您应该拥有 MDF 的文件夹与您的应用程序相同。
但是,遗憾的是这个位置没有写权限(比如 C:\program files)。任何数据库应用程序的基本要求。
所以最好的办法是将此文件放在您可以使用 Environment.SpecialFolder.CommonApplicationData 枚举检索的 CommonApplicationData 文件夹中
(最新版本Windows一般是C:\PROGRAMDATA)
string folder = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData);
string myAppFolder = Path.Combine(folder, "MyReservedAppDataFolder");
Directory.CreateDirectory(myAppFolder);
AppDomain.CurrentDomain.SetData("DataDirectory", myAppFolder);
所有这些都应该在应用程序中任何与数据访问相关的代码之前完成。
当然你可以保持现在的设置而不做任何改变。
目前我的 SQL 数据库在
C:\Users\Slaven\KasaMP.mdf
我想将它移动到我的项目目录 [也许 "database" 文件夹 (?)] 并正确更改我的连接字符串。 我的目标是能够在任何计算机上打开这个带有 .mdf 文件的项目。我使用的当前 ConnectionString 是 EntityFramework 生成的,我不确定使这个 CS 指向不同位置的方法是什么。
连接字符串:
<connectionStrings>
<add name="KasaMPEntities" connectionString="metadata=res://*/OsnovniPodaci.Model.csdl|res://*/OsnovniPodaci.Model.ssdl|res://*/OsnovniPodaci.Model.msl;provider=System.Data.SqlClient;provider connection string="data source=(localdb)\v11.0;AttachDbFilename=|DataDirectory|\KasaMP.mdf;initial catalog=KasaMP;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework""
providerName="System.Data.EntityClient" />
</connectionStrings>
我的项目路径:
C:\Users\Slaven\Documents\visual studio 2013\Projects\PCKasa\KasaMP
我在其他帖子中发现了下面这行,但我不确定它的作用:
AppDomain.CurrentDomain.SetData("DataDirectory", System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Database"));
我知道我必须将此属性放在 ConnectionString 中的某处
AttachDbFileName=|DataDirectory|\KasaMP.mdf
关于如何正确执行此操作的任何建议? ^ ^
在 WinForms 应用程序中,DataDirectory 替换字符串指向应用程序启动的文件夹。在 Visual Studio 会话的情况下,此文件夹是 BIN\DEBUG 或 BIN\RELEASE 文件夹(可能具有 x86 变体)
这在 Visual Studio 中运行良好,但您应该知道,在您的客户 PC 中并且不更改配置设置的情况下,您应该拥有 MDF 的文件夹与您的应用程序相同。
但是,遗憾的是这个位置没有写权限(比如 C:\program files)。任何数据库应用程序的基本要求。
所以最好的办法是将此文件放在您可以使用 Environment.SpecialFolder.CommonApplicationData 枚举检索的 CommonApplicationData 文件夹中 (最新版本Windows一般是C:\PROGRAMDATA)
string folder = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData);
string myAppFolder = Path.Combine(folder, "MyReservedAppDataFolder");
Directory.CreateDirectory(myAppFolder);
AppDomain.CurrentDomain.SetData("DataDirectory", myAppFolder);
所有这些都应该在应用程序中任何与数据访问相关的代码之前完成。 当然你可以保持现在的设置而不做任何改变。