Во-первых, вы развертываете его как данные, и ваша строка подключения показывает это. DataDirectory преобразуется в папку Data в кэше ClickOnce, и именно здесь ClickOnce помещает файл, если он помечен как данные.
Если вы не хотите, чтобы он здесь развертывался, но хотите, чтобы он относился к [exe], перейдите в диалог «Файлы приложения» на вкладке «Публикация» и измените его с «Включить (данные)» на «Включить». Затем он поместит его в местоположение относительно расположения exe. (Т.е. если у вас есть это в папке в вашем проекте, он поместит его в соответствующую папку в развернутом exe). Не забудьте изменить строку подключения.
Если вы развернете его в этом месте, он будет потерян при выпуске обновлений. (Просто чтобы ты знал). Вот идея о том, где еще вы можете разместить свои данные, чтобы избежать этой проблемы:
Как защитить ваши данные от обновлений ClickOnce
Вам необходимо создать строку подключения динамически, Path.Combine (System.Windows.Forms.Application.StartupPath, "Data \ mydatabase.mdf"); или он будет начинаться с пути по умолчанию для текущей сборки (в вашем случае - .NET).
- дополнение -
Argh, WPF, извините, пропустил это. В основном вам нужно получить папку, в которой работает ваш exe. Посмотрите, поможет ли это:
В пространстве имен System.Reflection:
Assembly assemblyInfo = Assembly.GetExecutingAssembly();
if (assemblyInfo != null)
{
//try Path.GetDirectoryName(assemblyInfo.Location)
//if that doesn't work, try assemblyInfo.CodeBase
}
(В приложениях VSTO вы должны использовать CodeBase из-за затенения dll. Я думаю, что Location будет работать для обычного приложения.)
RobinDotNet