我有一个解决方案(所有.NET 4.5项目),它有一个Windows服务,一个WPF UI应用程序和一个数据层,我有我的EDMX模型和通用存储库。
当我调试服务时,数据最终会在数据库中出现,我希望UI在启动时使用相同的数据库文件。
所以我创建了一个这样的目录:
[solution root directory]\Data
我将MDF和LDF放入其中。我确保我的EDMX模型在进行更新时使用此MDF文件。
对于服务和UI使用相同的MDF文件,我确保他们的连接字符串使用|DataDirectory|
符号并在它们都启动时执行此操作:
public MainWindow()
{
string dataDir = Utilities.Utilities.ReturnDataDirectory(System.Reflection.Assembly.GetExecutingAssembly());
AppDomain.CurrentDomain.SetData("DataDirectory", dataDir);
InitializeComponent();
Loaded += MainWindow_Loaded;
}
以下是ReturnDataDirectory
的代码:
public static string ReturnDataDirectory(Assembly referingAssembly)
{
string curDir = referingAssembly.Location;
string dataDir = string.Empty;
int x;
var curDirArray = curDir.Split('\\');
//Return a directory without the 'Solution.Name\bin\Debug' part...
for (x = 0; x < (curDirArray.Count() - 4);x++ )
{
dataDir += string.Format("{0}\\", curDirArray[x]);
}
return string.Format("{0}Data", dataDir);
}
这会生成MDF文件确实存在的确切目录,因此问题不存在,AFAIK。
然而,当我启动WPF UI时,我收到此错误:
An attempt to attach an auto-named database for file C:\\Dropbox\\My Docs\\MySolution\\MySolution.UI\\bin\\Debug\\MySolution.mdf failed. A database with the same name exists, or specified file cannot be opened, or it is located on UNC share.
为什么在正确设置|DataDirectory|
之后仍在尝试查看?反正没有MDF文件,这就是我目前的意图。
以下是WPF UI ap:
的app.config中使用的连接字符串<add name="MySolutionEntities" connectionString="metadata=res://*/MySolution.csdl|res://*/MySolution.ssdl|res://*/MySolution.msl;provider=System.Data.SqlClient;provider connection string="data source=(LocalDB)\v11.0;attachdbfilename=|DataDirectory|\MySolution.mdf;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
我错过了什么?
谢谢!
编辑:此方法适用于Windows服务项目,但不适用于WPF UI应用程序。是因为我设置|DataDirectory|
为时已晚?我也尝试使用Process Monitor嗅探一些东西,我无法获取尝试访问MDF的UI应用程序:(