Yod*_*oda 9 c# entity-framework app-config datadirectory localdb
我尝试在以下位置设置MyProject\App_Data\Cos.mdf数据库的位置App.config:
<connectionStrings>
<add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\Cos.mdf;Initial Catalog=Cos;Integrated Security=True;MultipleActiveResultSets=True" providerName="System.Data.SqlClient" />
</connectionStrings>
Run Code Online (Sandbox Code Playgroud)
在Program.cs我写道:
static void Main(string[] args) {
string relative = @"..\..\App_Data\Cos.mdf";
string absolute = Path.GetFullPath(relative);
AppDomain.CurrentDomain.SetData("DataDirectory", absolute);
Console.WriteLine(absolute);
Console.ReadKey();
}
Run Code Online (Sandbox Code Playgroud)
显示的路径是(我粘贴它表明我没有犯错):

但是当我输入Package Manager Console enable-migrations更改AutomaticMigrations为true时,输入update-databaseI get error:
Cannot attach the file 'C:\Users\s8359_000\Documents\Visual Studio 2013\Projects\Projekt5 — kopia\Projekt5\bin\Debug\Cos.mdf' as database 'Cos'.
为什么.NET尝试在Debug目录中创建我的数据库?!我在StackOverflow上讨论了这个主题的15个主题,看起来每个人都只是复制了不起作用的答案.
SRUTZKY回答后编辑 是的,你说错了.在你的回答后我尝试了更多的组合,不幸的是没有工作.
<connectionStrings>
<add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\baza.mdf;Initial Catalog=baza;Integrated Security=True;MultipleActiveResultSets=True" providerName="System.Data.SqlClient" />
</connectionStrings>
Run Code Online (Sandbox Code Playgroud)
和主要的
static void Main(string[] args) {
Console.WriteLine("BEFORE:" + AppDomain.CurrentDomain.GetData("DataDirectory"));
string relative = @"..\..\App_Data\Cos.mdf";
string absolute = Path.GetFullPath(relative);
absolute = Path.GetDirectoryName(@absolute);
AppDomain.CurrentDomain.SetData("DataDirectory", @absolute);
Console.WriteLine(@absolute);
Console.WriteLine(AppDomain.CurrentDomain.GetData("DataDirectory"));
Console.ReadKey();
}
Run Code Online (Sandbox Code Playgroud)
然后我进入控制台:

删除Migrations目录后enable-migrations,自动迁移为true,update-database我得到:
PM> update-database指定'-Verbose'标志以查看应用于目标数据库的SQL语句.System.Data.SqlClient.SqlException(0x80131904):发生文件激活错误.物理文件名'\ baza.mdf'可能不正确.诊断并更正其他错误,然后重试该操作.CREATE DATABASE失败.无法创建列出的某些文件名.检查相关错误.在System.Data.SqlClient.SqlConnection.OnError(SqlException异常,Boolean breakConnection,Action
1 wrapCloseInAction) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action在System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj,布尔callerHasConnectionLock,布尔asyncClose)的System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior,SqlCommand cmdHandler,SqlDataReader dataStream,BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject stateObj,Boolean&)中的1 wrapCloseInAction) dataReady)在System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(字符串方法名,布尔异步,的Int32超时,布尔asyncWrite)在System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite) at System.Data.SqlClient.SqlCommand.ExecuteNonQuery() at System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.<NonQuery>b__0(DbCommand t, DbCommandInterceptionContext1 c)中在System.Data.Entity.Infrastructure.Interception .InternalDispatcher1.Dispatch[TTarget,TInterceptionContext,TResult](TTarget target, Func3操作,TInterceptionContext interceptionContext,Action3 executing, Action3执行)System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.NonQuery(DbCommand命令,DbCommandInterceptionContext interceptionContext),位于System.Data.Entity的System.Data.Entity.SqlServer.SqlProviderServices.<> c__DisplayClass1a.b__19(DbConnection conn) System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute [TResult](Func1 operation) at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute(Action operation) at System.Data.Entity.SqlServer.SqlProviderServices.UsingConnection(DbConnection sqlConnection, Action1 act)的System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.<> c__DisplayClass1.b__0()处于.SqlServer.SqlProviderServices.<> c__DisplayClass33.b__32()在System.Data.Entity.SqlServer.SqlProviderServices.UsingMasterConnection(DbConnection sqlConnection,Action1 act) at System.Data.Entity.SqlServer.SqlProviderServices.CreateDatabaseFromScript(NullableSystem.Data.Entity.SqlServer.SqlProviderServices.DbCreateDatabase(DbConnection连接,Nullable)中的1 commandTimeout,DbConnection sqlConnection,String createDatabaseScript)1 commandTimeout, StoreItemCollection storeItemCollection) at System.Data.Entity.Core.Common.DbProviderServices.CreateDatabase(DbConnection connection, NullableSystem.Data.Entity.Migrations.DbMigrator上的System.Data.Entity.Migrations.Utilities.DatabaseCreator.Create(DbConnection连接)中的System.Data.Entity.Core.Objects.ObjectContext.CreateDatabase()处有1个commandTimeout,StoreItemCollection storeItemCollection) System.Data.Entity.Migrations.Infrastructure的System.Data.Entity.Migrations.Infrastructure.MigratorBase.EnsureDatabaseExists(Action mustSucceedToKeepDatabase)中的System.Data.Entity.Migrations.DbMigrator.Update(String targetMigration)中的.EnsureDatabaseExists(Action mustSucceedToKeepDatabase)位于System.AppDomain的System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)的System.Data.Entity.Migrations.Design.ToolingFacade.UpdateRunner.Run()处的.MigratorBase.Update(String targetMigration).DoCallBack(CrossAppDomainDelegate callBackDelegate)
在System.Data.Entity.Migrations.Design.ToolingFacade.Run(跑垒员浇道)在System.Data.Entity.Migrations.Design.ToolingFacade.Update(字符串targetMigration,布尔力)在System.Data.Entity.Migrations.UpdateDatabaseCommand. <.构造函数> <> c__DisplayClass2 b__0()在System.Data.Entity.Migrations.MigrationsDomainCommand.Execute(动作命令)ClientConnectionId:23ca49c1-4797-4bc3-8f16-f34fd77f2cbe发生文件激活错误.物理文件名'\ baza.mdf'可能不正确.诊断并更正其他错误,然后重试该操作.CREATE DATABASE失败.无法创建列出的某些文件名.检查相关错误.PM>
小智 9
您可以在Enable-Migrations命令创建的Configuration类中为Update-Database设置DataDirectory:
internal sealed class Configuration : DbMigrationsConfiguration<DataContext>
{
public Configuration()
{
AutomaticMigrationsEnabled = false;
var dataDirPath = "<YourPath>";
AppDomain.CurrentDomain.SetData("DataDirectory", dataDirPath);
}
}
Run Code Online (Sandbox Code Playgroud)
设置值时DataDirectory,它需要是目录,而不是文件.您传入的absolute变量值为:
C:\Users\s8359_000\Documents\Visual Studio 2013\Projects\Projekt5 — kopia\Projekt5\App_Data\Cos.mdf
Run Code Online (Sandbox Code Playgroud)
并包含文件名.那是无效的.DataDirectory是替换值,因此指定:
AttachDbFilename=|DataDirectory|\Cos.mdf
Run Code Online (Sandbox Code Playgroud)
在连接字符串中将转换为:
C:\Users\s8359_000\Documents\Visual Studio 2013\Projects\Projekt5 — kopia\Projekt5\App_Data\Cos.mdf\Cos.mdf
Run Code Online (Sandbox Code Playgroud)
那不是一条有效的道路.所以看来.NET看到的值DataDirectory无效并且不使用它,因此从当前工作目录开始.
使用Path.GetDirectoryName(relative)而不是Path.GetFullPath(relative)设置值,absolute它应该工作,因为它将设置值为DataDirectory:
C:\Users\s8359_000\Documents\Visual Studio 2013\Projects\Projekt5 — kopia\Projekt5\App_Data
Run Code Online (Sandbox Code Playgroud)
连接字符串的MSDN页面在底部标题为"支持| DataDirectory |替换字符串..."的部分中有一些额外的详细信息.
Update-Database)无权访问您正在设置"DataDirectory"值的控制台应用程序的AppDomain.我不知道如何以编程方式与Package Manager进行交互,但我确实设法弄清楚如何以编程方式触发"update-database"进程.只需在设置"DataDirectory"的值后添加以下行:
Database.SetInitializer(new
MigrateDatabaseToLatestVersion<YourDataContextName, Configuration>()
);
Run Code Online (Sandbox Code Playgroud)
您还需要至少一个(如果不是两个)using语句:
using System.Data.Entity;using ProjectName.Migrations; // namespace of Migrations\Configuration.cs请注意,仅此一项不会创建数据库.首次通过DbContext 访问数据库时,将发布任何挂起的更改.
例:
using System.Data.Entity;
using Projekt5.Migrations;
....
string relative = @"..\..\App_Data\Cos.mdf";
string absolute = Path.GetDirectoryName(absolute);
AppDomain.CurrentDomain.SetData("DataDirectory", absolute);
Database.SetInitializer(new
MigrateDatabaseToLatestVersion<Projekt5Context, Configuration>()
);
// database not created yet
using (var db = new Projekt5Context())
{
db.Things.Add(new Thing { Name = "OMG This works!" });
db.SaveChanges();
}
// database CREATED!
Run Code Online (Sandbox Code Playgroud)
此外,您可能需要通过程序包管理器调用以下命令(它不会立即对数据库执行任何操作,因此不会访问连接字符串):
Add-Migration InitialMigration
Run Code Online (Sandbox Code Playgroud)
有关详细信息,请参阅CodeDN 迁移的MSDN页面.
一旦这行代码调用SetInitializer是那里MigrateDatabaseToLatestVersion,它只是:每次运行时(这就是为什么在控制台应用程序的开始做)会在同步之间是什么在"模式"的任何变化(即现在编译成Assembly)和数据库,确保数据库具有最新版本.这假定在DbContext类中表示任何新表.但是不需要运行其他程序包管理器命令.
要将 DataDirectory 指向控制台项目和 EF 代码优先迁移下名为“AppData”的文件夹,您必须执行以下操作:
public static class AppData
{
public static void Set()
{
// Set the |DataDirectory| path used in connection strings to point to the correct directory for console app and migrations
var baseDirectory = AppDomain.CurrentDomain.BaseDirectory;
string relative = @"..\..\App_Data\";
string absolute = Path.GetFullPath(Path.Combine(baseDirectory, relative));
AppDomain.CurrentDomain.SetData("DataDirectory", absolute);
}
}
Run Code Online (Sandbox Code Playgroud)
AppData.Set()然后从控制台应用程序和数据库迁移的入口点调用:
1)控制台应用程序的Main-method或Startup-class:
class Program
{
static void Main()
{
AppData.Set();
}
}
Run Code Online (Sandbox Code Playgroud)
2) EF代码优先迁移
public class DatabaseContext : DbContext
{
// Add this constructor to your database context
public DatabaseContext() : base()
{
AppData.Set();
}
// DbSet's are defined here
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11108 次 |
| 最近记录: |