sql - mvc - entity framework example
Dónde está | DataDirectory | definido? (3)
Esta es una pregunta de seguimiento de ¿Dónde está ese archivo 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á predeterminado, pero no puedo encontrar el archivo en sí,
NO ESTÁ ALLÍ .
Dónde / cómo se obtiene | DataDirectory | definido ?
¿Dónde está guardado el archivo, incluso existe? Si no, ¿qué está pasando?
editar : el archivo no se encuentra en AppDomain.CurrentDomain.GetData("DataDirectory").ToString();
todas las respuestas (sqattered) me dicen que debería ser. Debe estar en algún lugar, ya que el depurador rompe las quejas sobre el modelo desigual de la mesa cuando cambio el modelo. No está allí.
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 base de datos, puede definir la ruta usted mismo con AppDomain.SetData .
The |DataDirectory|
no es un archivo 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 directorio 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 predeterminado 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 archivos de bases de datos locales es que se tratan como cualquier otro archivo de contenido. Para los proyectos de escritorio, significa que, de forma predeterminada, el archivo de la base de datos se copiará 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 diseño, MyProject / Data.mdf es utilizado por las herramientas de datos. En tiempo de ejecución, la aplicación utilizará la base de datos en la carpeta de salida. Como resultado de la copia, muchas personas tienen la impresión de que la aplicación no guardó los datos en el archivo de la base de datos. De hecho, esto es simplemente porque hay dos copias del archivo de datos involucrado. Lo mismo aplica cuando se mira el esquema / datos a través del explorador de la base de datos. Las herramientas están usando la copia en el proyecto, no la de la carpeta bin.
The | datadirectory | El algoritmo se encuentra en el ensamblado System.Data.dll, en la clase interna System.Data.Common.DbConnectionOptions. Aquí aparece como ILSpy (tenga en cuenta que la fuente ya está disponible en el repositorio de fuentes de referencia: 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 predeterminada, no creo que haya definido datos de "DataDirectory") y luego llega al directorio base actual de AppDomain. El resto consiste principalmente en verificar la raíz de las rutas y la normalización de las rutas.