Dónde está | DataDirectory | definido?

Esta es una pregunta de seguimiento de ¿Dónde está ese file en mi sistema?

Gran cantidad de preguntas y respuestas en todo el SO e Internet, pero no puedo encontrar ninguna que responda a esta pregunta específica.

Todo está pnetworkingeterminado, pero no puedo encontrar el file en sí,

NO ESTÁ ALLÍ .

Dónde / cómo se obtiene | DataDirectory | definido ?

¿Dónde está guardado el file, incluso existe? Si no, ¿qué está pasando?

editar : el file no se encuentra en AppDomain.CurrentDomain.GetData("DataDirectory").ToString(); todas las respuestas (sqattenetworking) me dicen que debería ser. Debe estar en algún lugar, ya que el depurador rompe las quejas sobre el model desigual de la table cuando cambio el model. No está allí.

The |DataDirectory| no es un file per se. Una cita de este viejo artículo de MSDN (lea el artículo completo para más detalles):

Por defecto, | DataDirectory | la variable se expandirá de la siguiente manera:

  • Para las aplicaciones colocadas en un directory en la máquina del usuario, esta será la carpeta de la aplicación (.exe).
  • Para las aplicaciones que se ejecutan en ClickOnce, esta será una carpeta de datos especial creada por ClickOnce
  • Para aplicaciones web, esta será la carpeta App_Data

Debajo del capó, el valor de | DataDirectory | simplemente proviene de una propiedad en el dominio de la aplicación. Es posible cambiar ese valor y anular el comportamiento pnetworkingeterminado al hacer esto:

 AppDomain.CurrentDomain.SetData("DataDirectory", newpath) 

Una cita adicional con respecto a las inconsistencias de su esquema:

Una de las cosas que debe saber al trabajar con files de bases de datos locales es que se tratan como cualquier otro file de contenido. Para los proyectos de escritorio, significa que, de forma pnetworkingeterminada, el file de la database se copyrá a la carpeta de salida (también conocido como bin) cada vez que se crea el proyecto. Después de F5, esto es lo que se vería en el disco

  MyProject\Data.mdf MyProject\MyApp.vb MyProject\Bin\Debug\Data.mdf MyProject\Bin\Debug\MyApp.exe 

En el momento del layout, MyProject \ Data.mdf es utilizado por las herramientas de datos. En time de ejecución, la aplicación utilizará la database en la carpeta de salida. Como resultado de la copy, muchas personas tienen la printing de que la aplicación no guardó los datos en el file de la database. De hecho, esto es simplemente porque hay dos copys del file de datos involucrado. Lo mismo aplica cuando se mira el esquema / datos a través del explorador de la database. Las herramientas están usando la copy en el proyecto, no la de la carpeta bin.

The | datadirectory | El algorithm se encuentra en el ensamblado System.Data.dll, en la class interna System.Data.Common.DbConnectionOptions. Aquí aparece como ILSpy (tenga en count que la fuente ya está disponible en el repository de fonts de reference: https://github.com/Microsoft/referencesource/blob/e458f8df6ded689323d4bd1a2a725ad32668aaec/System.Data.Entity/System/Data/EntityClient/DbConnectionOptions.cs )

 internal static string ExpandDataDirectory(string keyword, string value, ref string datadir) { string text = null; if (value != null && value.StartsWith("|datadirectory|", StringComparison.OrdinalIgnoreCase)) { string text2 = datadir; if (text2 == null) { // 1st step! object data = AppDomain.CurrentDomain.GetData("DataDirectory"); text2 = (data as string); if (data != null && text2 == null) throw ADP.InvalidDataDirectory(); if (ADP.IsEmpty(text2)) { // 2nd step! text2 = AppDomain.CurrentDomain.BaseDirectory; } if (text2 == null) { text2 = ""; } datadir = text2; } // 3rd step, checks and normalize int length = "|datadirectory|".Length; bool flag = 0 < text2.Length && text2[text2.Length - 1] == '\\'; bool flag2 = length < value.Length && value[length] == '\\'; if (!flag && !flag2) { text = text2 + '\\' + value.Substring(length); } else { if (flag && flag2) { text = text2 + value.Substring(length + 1); } else { text = text2 + value.Substring(length); } } if (!ADP.GetFullPath(text).StartsWith(text2, StringComparison.Ordinal)) throw ADP.InvalidConnectionOptionValue(keyword); } return text; } 

Por lo tanto, se ve primero en los datos actuales de AppDomain (de manera pnetworkingeterminada, no creo que haya definido datos de "DataDirectory") y luego llega al directory base actual de AppDomain. El rest consiste principalmente en verificar la raíz de las routes y la normalización de las routes.

En el foro de MSDN hay una pregunta similar pero simplificada sobre esto, que dice:

Por defecto, el | DataDirectory | apunta a la carpeta de la aplicación (tal como se descubrió en la pregunta original: a App_Data).

Dado que es solo una ruta de sustitución a su database, puede definir la ruta usted mismo con AppDomain.SetData .