天道酬勤,学无止境

如何在控制台应用程序中为 ConnectionString 定义 DataDirectory 以使用 EntityFramework Code First Migrations(How to define DataDirectory for ConnectionString in console application to work with EntityFramework Code First Migrations)

问题

我尝试在App.config为数据库设置位置MyProject\App_Data\Cos.mdf

 <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>

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();
 }

显示的路径是(我把它贴出来说明我没有弄错):

在此处输入图片说明

但是当我输入 Package Manager Console enable-migrationsAutomaticMigrations更改为 true,然后输入update-database我得到错误:

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>

和主要

  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();
}

然后我进入控制台:

在此处输入图片说明

在删除Migrations目录和enable-migrations ,自动迁移到 true, update-database我得到:

PM> update-database 指定“-Verbose”标志以查看应用于目标数据库的 SQL 语句。 System.Data.SqlClient.SqlException (0x80131904):发生文件激活错误。 物理文件名“\baza.mdf”可能不正确。 诊断并更正其他错误,然后重试该操作。 创建数据库失败。 无法创建列出的某些文件名。 检查相关错误。 在 System.Data.SqlClient.SqlConnection.OnError(SqlException 异常,Boolean breakConnection,Action 1 wrapCloseInAction) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action 1 wrapCloseInAction) 在 System.Data.SqlClient.TdsParser .ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsCommandParserData.Boolean SqlClient stateOb. RunExecuteNonQueryTds(String methodName, Boolean async, Int32 timeout, Boolean asyncWrite) at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource 1 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, DbCommandInterceptionContext 1 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, DbCommandInterceptionContext 1 c) at System.Data.Entity.Infrastructure.Interception.InternalDispatcher 1.Dispatch[TTarget,TInterceptionContext,TResult](TTarget target, Func 3 operation,TInterceptionContextinterceptionContext,Action 3 executing, Action 3 执行)在 System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.NonQuery(DbCommand 命令,DbCommandInterceptionContext 拦截上下文)在 System.Data.Entity.SqlServer.SqlProviderServices.<>c__DisplayClass1a.b__19(DbConnection conn) 在 System .Data.Entity.SqlServer.SqlProviderServices.<>c__DisplayClass33.b__32() 在 System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.<>c__DisplayClass1.b__0() 在 System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute[TResult]( Func 1 operation) at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute(Action operation) at System.Data.Entity.SqlServer.SqlProviderServices.UsingConnection(DbConnection sqlConnection, Action 1 operation) at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute(Action operation) at System.Data.Entity.SqlServer.SqlProviderServices.UsingConnection(DbConnection sqlConnection, Action 1 act) at System.Data.Entity.SqlServer.SqlProviderServices.UsingMasterConnection(DbConnection sqlConnection, Action 1 act) at System.Data.Entity.SqlServer.SqlProviderServices.CreateDatabaseFromScript(Nullable 1 commandTimeout, DbConnection sqlConnection, String createDatabaseScript) at System.Data.Entity.SqlServer.SqlProviderServices.DbCreateDatabase(DbConnection connection, Nullable 1 commandTimeout, StoreItemCollection storeItemCollection) at System.Data.Entity.Core.Common.DbProviderServices.CreateDatabase(DbConnection connection, Nullable 1 commandTimeout, StoreItemCollection storeItemCollection) 在 System. Data.Entity.Core.Objects.ObjectContext.CreateDatabase() 在 System.Data.Entity.Migrations.Utilities.DatabaseCreator.Create(DbConnection connection) 在 System.Data.Entity.Migrations.DbMigrator.EnsureDatabaseExists(Action mustSucceedToKeepDatabase) 在 System。 Data.Entity.Migrations.Infrastructure.MigratorBase.EnsureDatabaseExists(Action mustSucceedToKeepDatabase) 在 System.Data.Entity.Migrations.DbMigrator.Update(String targetMigration) at System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update(String targetMigration) at System.Data.Entity.Migrations.Design.ToolingFacade.UpdateRunner.Run( ) 在 System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate) 在 System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)
在 System.Data.Entity.Migrations.Design.ToolingFacade.Run(BaseRunner runner) 在 System.Data.Entity.Migrations.Design.ToolingFacade.Update(String targetMigration, Boolean force) 在 System.Data.Entity.Migrations.UpdateDatabaseCommand。 <>c__DisplayClass2.<.ctor>b__0() 在 System.Data.Entity.Migrations.MigrationsDomainCommand.Execute(Action command) ClientConnectionId:23ca49c1-4797-4bc3-8f16-f34fd77f2cbe 发生文件激活错误。 物理文件名“\baza.mdf”可能不正确。 诊断并更正其他错误,然后重试该操作。 创建数据库失败。 无法创建列出的某些文件名。 检查相关错误。 下午>

回答1

问题 1(共 2 个)

当您设置DataDirectory的值时,它需要是一个目录,而不是一个文件。 您正在传递absolute变量的值,即:

C:\Users\s8359_000\Documents\Visual Studio 2013\Projects\Projekt5 — kopia\Projekt5\App_Data\Cos.mdf

并包含文件名。 那是无效的。 DataDirectory是一个替代值,因此指定:

AttachDbFilename=|DataDirectory|\Cos.mdf

在连接字符串中将转换为:

C:\Users\s8359_000\Documents\Visual Studio 2013\Projects\Projekt5 — kopia\Projekt5\App_Data\Cos.mdf\Cos.mdf

那不是有效的路径。 所以看起来 .NET 看到DataDirectory的值无效并且不使用它,因此在当前工作目录中启动。

使用Path.GetDirectoryName(relative)而不是Path.GetFullPath(relative)来设置absolute的值,它应该可以工作,因为它将DataDirectory的值设置为:

C:\Users\s8359_000\Documents\Visual Studio 2013\Projects\Projekt5 — kopia\Projekt5\App_Data

连接字符串的 MSDN 页面底部有一些附加详细信息,在标题为“支持 |DataDirectory| 替换字符串...”的部分中

问题 2(共 2 个)

  1. “DataDirectory”是在 AppDomain 中设置的。
  2. 控制台应用程序有自己的 AppDomains,它们在启动时创建并在退出时消失。
  3. 包管理器(您在其中运行Update-Database )无权访问您在其中设置“DataDirectory”值的控制台应用程序的 AppDomain。
  4. 您需要:
    1. 在包管理器中以编程方式设置“DataDirectory”,或
    2. 在控制台应用程序的上下文中以编程方式运行“更新数据库”

我不知道如何以编程方式与包管理器交互,但我确实设法弄清楚如何以编程方式触发“更新数据库”过程。 只需在设置“DataDirectory”的值后添加以下行:

Database.SetInitializer(new
    MigrateDatabaseToLatestVersion<YourDataContextName, Configuration>()
 );

您还需要至少一个(如果不是两个) 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!

此外,您可能需要一次通过包管理器调用以下内容(它不会立即对数据库执行任何操作,因此不会访问连接字符串):

Add-Migration InitialMigration

有关详细信息,请参阅 Code First 迁移的 MSDN 页面。

一旦调用SetInitializer这行代码与SetInitializer一起MigrateDatabaseToLatestVersion ,它就MigrateDatabaseToLatestVersion :每次运行时(这就是为什么在控制台应用程序的开头完成)它会同步“模型”中的内容之间的任何更改(现在编译到程序集中)和数据库,确保数据库具有最新版本。 这假定任何新表都在DbContext类中表示。 但是不需要运行额外的包管理器命令。

回答2

您可以在由 Enable-Migrations 命令创建的 Configuration 类中为 Update-Database 设置 DataDirectory:

internal sealed class Configuration : DbMigrationsConfiguration<DataContext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = false;
        var dataDirPath = "<YourPath>";
        AppDomain.CurrentDomain.SetData("DataDirectory", dataDirPath);
    }
}
回答3

要将 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);
    }
}

然后从控制台应用程序和数据库迁移的入口点调用AppData.Set()

1) 控制台应用程序的 Main-method 或 Startup-class:

class Program
{
    static void Main()
    {
         AppData.Set();
    }
}

2) EF 代码第一次迁移

public class DatabaseContext : DbContext
{
    // Add this constructor to your database context
    public DatabaseContext() : base()
    {
        AppData.Set();
    }

    // DbSet's are defined here
}

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 尝试为文件…database1.mdf附加自动命名的数据库失败(An attempt to attach an auto-named database for file …database1.mdf failed)
    问题 调试Visual Studio 2010网站时出现以下错误: 尝试为文件C:\ Users ... \ Desktop \ Dpp2012New \ App_Data \ dppdatabase.mdf附加自动命名的数据库失败。 存在具有相同名称的数据库,或者无法打开指定的文件,或者该数据库位于UNC共享上。 说明:执行当前Web请求期间发生未处理的异常。 请查看堆栈跟踪,以获取有关错误及其在代码中起源的更多信息。 异常详细信息:System.Data.SqlClient.SqlException:尝试为文件C:\ Users ... \ Desktop \ Dpp2012New \ App_Data \ dppdatabase.mdf附加自动命名数据库的尝试失败。 存在具有相同名称的数据库,或者无法打开指定的文件,或者该数据库位于UNC共享上。 这是我的web.config连接字符串: <connectionStrings> <add name="ApplicationServices" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnetdb.mdf;User Instance=true"
  • 如何在Visual Studio 2012和Entity Framework 5中为单元测试设置LocalDb(How to set up LocalDb for unit tests in Visual Studio 2012 and Entity Framework 5)
    问题 我们有一个使用实体框架5的Visual Studio 2012 ASP.NET MVC项目。 有一些依赖于数据库的单元测试。 在测试项目中设置app.config文件以使用中央SQL Server数据库可以正常工作。 但是,最好使用LocalDb,以便每个开发人员在运行测试时都有自己的数据库。 特别是因为我们希望在运行时将测试设置为DropCreateDatabaseAlways 。 但是,我无法使设置正常工作。 如果我在app.config中尝试此操作: <add name="TestDb" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=unittestdb; Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\unittestdb.mdf" providerName="System.Data.SqlClient" /> 我得到: System.Data.SqlClient.SqlException:发生文件激活错误。 物理文件名“ \ unittestdb.mdf”可能不正确。 诊断并更正其他错误,然后重试该操作。 创建数据库失败。 列出的某些文件名无法创建。 检查相关错误。 听起来好像它想要mdf文件已经存在,这似乎很奇怪
  • 不支持使用相同的 DbCompiledModel 针对不同类型的数据库服务器创建上下文(Using the same DbCompiledModel to create contexts against different types of database servers is not supported)
    问题 我正在从 Microsoft 的教程中学习 ASP.NET MVC: http://www.asp.net/mvc/tutorials/getting-started-with-aspnet-mvc3/cs/accessing-your-model's-https://stackoverflow.com/editing-helpdata-from-a-controller 在上面提到的链接中,添加名为“MoviesController”的控制器时,出现此错误 “无法检索‘MvcMovie.Models.Movie’的元数据。不支持使用相同的 DbCompiledModel 为不同类型的数据库服务器创建上下文。相反,为正在使用的每种类型的服务器创建一个单独的 DbCompiledModel” 我该如何解决? 回答1 我遇到过同样的问题。 我将providerName="System.Data.SqlServerCe.4.0"与providerName="System.Data.SqlClient"切换,它创建了控制器和视图。 我发现了这个:http://msdn.microsoft.com/en-US/library/ms171861.aspx 我按照指示添加了对 SQL Server Compact 的引用,但它仍然不起作用。 我还尝试注释掉默认的 SQL Server
  • 如何设置SQL Server连接字符串?(How can I set an SQL Server connection string?)
    问题 我正在开发一个简单的C#应用​​程序,我想知道这一点:当我将应用程序连接到PC上的SQL Server时,我知道连接字符串(服务器名称,密码等),但是当我连接它时到另一台PC,SQL Server连接字符串是不同的。 SQL Server中是否有一个可以连接的默认帐户附带的普通帐户? 我听说过SQL Server中的sa帐户。 什么是sa ? 回答1 .NET DataProvider-使用用户名和密码的标准连接 using System.Data.SqlClient; SqlConnection conn = new SqlConnection(); conn.ConnectionString = "Data Source=ServerName;" + "Initial Catalog=DataBaseName;" + "User id=UserName;" + "Password=Secret;"; conn.Open(); .NET DataProvider-可信连接 SqlConnection conn = new SqlConnection(); conn.ConnectionString = "Data Source=ServerName;" + "Initial Catalog=DataBaseName;" + "Integrated Security=SSPI
  • SQL Express连接字符串:相对于应用程序位置的mdf文件位置(SQL Express connection string: mdf file location relative to application location)
    问题 我将SQL Express数据库用作c#中的单元测试项目的一部分。 我的数据库位于这里: ./Databases/MyUnitTestDB.mdf 我想在app.config使用相对路径或变量,而不是将我的连接字符串定义为: AttachDbFilename=C:\blah\blah\blah\yea\yea\yea\MyApplication\Databases\MyUnitTestDB.mdf 我已经看过|DataDirectory|的用法但是我认为这仅适用于Web应用程序正确吗? 我想在应用程序配置文件中对此进行控制,因为在生产中,应用程序使用托管的sql数据库。 回答1 谢谢大家,我结合了您的回答。 在我的app.config文件中,我的连接字符串定义如下 <add name="MyConnectionString" connectionString="Server=.\SQLExpress;AttachDbFilename=|DataDirectory|\MyDatabase.mdf;Database=MyDatabaseForTesting;Trusted_Connection=Yes;" /> 在我的单元测试类中,我使用以下命令设置DataDirectory属性 [TestInitialize] public void TestInitialize() {
  • 当源文件路径更改时,如何保持与项目的数据库连接性?(How do I retain database connectivity, with my project, when the source file path changes?)
    问题 我在我的项目中使用Microsoft Access数据库。 保存到bin文件夹中。 当文件路径更改时,我该怎么做以确保与该数据库的连接? 导入System.Data.OleDb公共类Form3 Dim con作为新的OleDb.OleDbConnection Dim da As OleDbDataAdapter 将Dim ds作为新数据集昏暗的str1作为字符串 con.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\AARVIII\Documents\DATABASE\MP1.accdb" 回答1 您的连接字符串将数据库定位在仅在您的PC上有效的固定位置。 一个简单的解决方法是使用| DataDirectory | 替换字符串。 con.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=|DataDirectory|\MP1.accdb" 这样,您可以通过代码控制数据库的位置。 通常(对于桌面应用程序) | DataDirectory | 替换字符串指向安装了应用程序的文件夹,但是您需要具有在其中写入的权限,并且任何类型的活动数据库都需要对其文件具有写权限。 因此
  • WebConfig.ConnectionString中的相对路径参考(Relative path reference in WebConfig.ConnectionString)
    问题 是否可以在web.config中的connectionstring,attachDbFileName属性中指定相对路径引用? 例如,在我的数据库位于App_data文件夹中,我可以轻松地将AttachDBFilename指定为| DataDirectory | \ mydb.mdf和| Datadirectory |。 将自动解析为正确的路径。 现在,假设web.config文件位于A文件夹中,但是数据库位于B \ App_data文件夹中,其中A和B文件夹位于同一文件夹中。 无论如何,有没有使用相对路径引用来解析为正确路径的方法? 回答1 在以下情况下,我遇到了同样的问题:我想使用与集成测试中的应用程序相同的数据库。 我采用以下解决方法: 在我的测试项目的App.config中,我有: <appSettings> <add key="DataDirectory" value="..\..\..\BookShop\App_Data\"/> </appSettings> 在测试设置中,我执行以下代码: var dataDirectory = ConfigurationManager.AppSettings["DataDirectory"]; var absoluteDataDirectory = Path.GetFullPath(dataDirectory)
  • 我如何读取| DataDirectory |的当前路径。 从配置设置(How do I read the current path of |DataDirectory| from config settings)
    问题 我正在编写一个程序,要求用户在应用程序启动时选择活动数据库。 我有一个Windows窗体,该窗体将列出存储在ApplicationData子文件夹中的数据库,该子文件夹专门用于存储数据库文件。 但是,当我创建一个新数据库时,我需要复制模板数据库,但是无法确定默认情况下该数据库的存储位置。 我试过了: dpath = ConfigurationManager.AppSettings["DataDirectory"]; 我似乎总是得到一个空值作为回报。 有一次我放弃了,以为我可以将DataDirectory设置为我选择的文件夹,但是看来我在执行程序时太晚了,无法使其生效。 newdpath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\MyAppFolder"; 对于如何找到数据库的位置,或者我自己尽早设置数据库以影响程序操作的任何建议,我将不胜感激。 编辑: 对于第二部分,我发现我已经在执行TableAdapter.Fill命令之后试图修改连接字符串,从而解释了为什么要打开默认数据库。 这个谜已经解决了。 但是,第一部分仍然是一个未知数。 谢谢你。 回答1 |DataDirectory| 不是来自配置设置; 您混淆了三种不同的东西: ConfigurationManager
  • 添加控制器错误无法检索元数据(Add controller error unable to retrieve metadata)
    问题 我想在VS2012的MVC 4应用程序中添加控制器,如下图所示: 模型: using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Data.Entity; namespace MvcDemo.Models { public class MovieDB { public int ID { get; set; } public string Title { get; set; } public string Director { get; set; } public DateTime Date { get; set; } } public class MovieDBContext : DbContext { public DbSet<MovieDB> Movies { get; set; } } } 连接字符串: <connectionStrings> <add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=aspnet-MvcDemo-20130315191956;Integrated Security=SSPI
  • 在 Visual Studio 2012 中创建控制器时出错(Error when creating a Controller in Visual Studio 2012)
    问题 我正在尝试学习 ASP.NET MVC,所以我正在关注 asp.net 网站上的音乐商店教程。 我正在使用 Album.cs 作为模型类和 MusicStoreEntities.cs 作为数据上下文类创建 StoreManagerController。 创建控制器时的错误是:无法检索“MvcMusicStore.Models.Album”的元数据。 不支持使用相同的 DbCompiledModel 针对不同类型的数据库服务器创建上下文。 相反,为正在使用的每种类型的服务器创建一个单独的 DbCompiledModel。 听起来我正在使用两个不同的数据库,但这是我来自 Web.config 的连接字符串部分: <connectionStrings> <add name="MusicStoreEntities" providerName="System.Data.SqlServerCe.4.0" connectionString="Data Source=|DataDirectory|\MvcMusicStore.sdf"/> </connectionStrings> 奇怪的是,如果我注释掉 MusicStoreEntities 连接字符串,然后尝试创建它可以工作的 StoreManagerController。 如果我将解决方案设置中的目标框架更改为 .NET
  • 应用程序无法搭建物品(Application can't scaffold items)
    问题 我在VS 2013 Professional中创建了MVC 5应用程序,然后首先将EF 6.1代码与SQL Server Express上的现有数据库一起使用。 当我尝试创建视图时,我使用的是“新支架项目…”,然后选择“使用Entity Framework的带有视图的MVC 5控制器”。 我选择模型和上下文类,然后单击“确定”。 然后出现以下错误信息,并且没有代码被创建。 我已经卸载了EF Power Tools并出现了同样的错误。 错误 运行所选代码生成器时发生错误:“调用目标已引发异常。” 我还尝试了卸载/重新安装VS 2013和SQL Server且未做任何更改。 关于什么可能导致此错误的任何其他想法? 回答1 我也遇到了这个问题,我通过在数据库上下文中调用base.onModelCreating解决了该问题。 base.OnModelCreating(modelBuilder); 回答2 就我而言,我将连接字符串从Web.config中移到了 <connectionStrings configSource="ConnectionStrings.config"/> 当我尝试搭建脚手架时开始出现错误时。 运行所选代码生成器时发生错误:“调用目标已引发异常。” 将我的连接字符串移回Web.config解决了我的问题。 回答3 这为我解决了这个问题,
  • System.Data.SqlClient.SqlException: 用户 XXX 登录失败(System.Data.SqlClient.SqlException: Login failed for user XXX)
    问题 我正在 IIS 7.5 上部署一个 Web 应用程序,该 Web 应用程序具有三种自行车供用户选择(山地自行车、公路自行车和旅行自行车)。 当我点击每一个时,我遇到了问题 System.Data.SqlClient.SqlException: 用户 XXX 登录失败 这是我的连接字符串: <connectionStrings> <add name="DefaultConnection" providerName="System.Data.SqlClient" connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=aspnet-AdventureCycle-20140110145435;Integrated Security=SSPI" /> <add name="AdvenBikesEntities" connectionString="metadata=res://*/Models.BikesDB.csdl|res://*/Models.BikesDB.ssdl|res://*/Models.BikesDB.msl;provider=System.Data.SqlClient;provider connection string="Data Source=.\SQLEXPRESS
  • 如何使用C#连接到MS Access文件(mdb)?(How to connect to a MS Access file (mdb) using C#?)
    问题 我正在尝试连接到mdb文件,并且我知道我需要Microsoft.OLEDB.JET.4.0数据提供程序。 不幸的是,我没有在(大学)机器上安装它。 由于他们不提供该提供程序,因此我认为应该有一个解决方法。 在没有Microsoft.OLEDB.JET.4.0的情况下,如何连接文件?或者有其他选择吗? 我有以下提供商: 我曾尝试使用OLE DB Provider for Microsoft Directory Services ,在测试连接时,我得到“测试成功,但提供程序未接受某些设置”。 我采用了该字符串并使用了它,但ADsDSOObject' failed with no error message available, result code: DB_E_ERRORSINCOMMAND(0x80040E14) 。 回答1 最简单的连接方式是使用如下代码通过OdbcConnection进行连接 using System.Data.Odbc; using(OdbcConnection myConnection = new OdbcConnection()) { myConnection.ConnectionString = myConnectionString; myConnection.Open(); //execute queries, etc }
  • 无法将文件* .mdf作为数据库附加(Cannot attach the file *.mdf as database)
    问题 基本上,我已按照教程进行操作,并决定稍后删除.mdf文件。 现在,每当我尝试运行该应用程序时,都会出现以下错误(该线程的标题)。 出现错误的代码如下所示(ASP.NET MVC 4): OdeToFoodDB db = new OdeToFoodDB(); public ActionResult Index() { var model = db.Restaurants.ToList(); return View(model); } 我的连接字符串如下: <add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=OdeToFoodDb;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\OdeToFoodDb.mdf" providerName="System.Data.SqlClient" /> 我尝试查看SQL Server对象资源管理器,但看起来如下所示: 另外,在服务器资源管理器中,我看不到任何数据连接。 当我尝试在Server Explorer中添加新连接时,我看不到任何名为OdeToFoodDb数据库。 抱歉,这个问题很广泛,但是我是Entity Framework的新手
  • 我可以在实体框架 5 中为 localdb 数据库指定文件名吗?(Can I specify the filename for a localdb database in entity framework 5?)
    问题 如果我将 Entity Framework 5 与 LocalDb 一起使用,有没有办法在 app.config/web.config 文件中指定数据库的文件名? 回答1 经过进一步调查,它看起来非常简单,但在阅读文档时并不清楚。 首先你需要有实体框架部分的配置 <entityFramework> <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework"> <parameters> <parameter value="v11.0" /> </parameters> </defaultConnectionFactory> 一旦你有了它,你就需要指定你的连接字符串。 默认情况下,连接字符串名称是上下文的完全限定名称。 所以在我的测试应用程序中,上下文被称为“DataModel.Context”,所以我需要一个“DataModel.Context”的连接字符串 <connectionStrings> <add name="DataModel.Context" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=database;Integrated
  • 新的ASP.NET MVC 5应用程序如何知道如何创建数据库以及帐户控制器如何访问数据库?(How does a new ASP.NET MVC 5 application know how to create a database and how does the Account Controller access the database?)
    问题 我使用Visual Studio 2013 Update 2创建了ASP.NET MVC 5应用程序。 在应用程序中,我有一个帐户控制器。 它与我习惯的有所不同,并且不包含dbcontext的实例化。 public class AccountController : Controller { private ApplicationUserManager _userManager; public AccountController() { } public AccountController(ApplicationUserManager userManager) { UserManager = userManager; } public ApplicationUserManager UserManager { get { return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>(); } private set { _userManager = value; } } 默认情况下创建的我的web.config具有如下连接字符串: <connectionStrings> <add name="DefaultConnection"
  • 如何将ASP.NET MVC数据库从LocalDb传输到SQL Server?(How to transfer ASP.NET MVC Database from LocalDb to SQL Server?)
    问题 我在Visual Studio 2013(用于Web的Express)中创建了一个新的ASP.NET MVC 5项目,默认情况下,该项目使用LocalDb作为其数据库,但是如何将数据库传输或迁移到SQL Server? 我想对数据库使用SQL Server而不是LocalDb。 但是如何? 回答1 尽管这个问题很旧,但是答案并没有帮助我,所以我想分享我如何为自己解决问题。 在服务器资源管理器上,找到您的ASPNet DB。 然后使用SQL Server对象资源管理器将其打开。 然后去打模式比较选项 然后,在“目标”数据库的“架构比较”窗口中,选择要与ASPNet DB集成的SQL Server数据库。 然后点击“比较”按钮 取消选择目标数据库的所有“删除”操作,并保留选中的ASPNet DB的所有“添加”操作,然后单击“更新”按钮。 最后,更新您的连接字符串,使其指向您的SQL Server数据库 回答2 知道了! 基于@ warheat1990的答案,您只需更改连接字符串。 但是@ warheat1990的答案有太多变化。 所以这是我原始的(LocalDb)连接字符串: <add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=
  • EF 5 + SQL Server CE 4:如何为数据库文件指定自定义位置?(EF 5 + SQL Server CE 4: How to specify custom location for database file?)
    问题 我正在开发需要小型本地数据库的客户端系统。 我想避免安装SQL Server Express,并决定使用SQL Server 4。 我使用Entity Framework 5进行数据访问,并创建了自定义上下文。 在开发中一切正常,在这里我可以使用app.config设置特定文件位置或动态Data Source=|DataDirectory|\MyDatabase.sdf 。 但是在部署时,我希望数据库位于用户文档文件夹中: \My Documents\ApplicationName\MyDatabase.sdf 我怎样才能做到这一点? 我所需要做的实际上就是能够在代码中设置自定义连接字符串! 这是我到目前为止尝试过的: private MyApplicationDataContext(string connectionString) : base(connectionString) { } public static MyApplicationDataContext CreateInstance() { var directory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); var path = Path.Combine(directory, @"ApplicationName
  • 在C#.NET中创建安装文件后更改连接字符串(Change Connection String After Creating Setup File in C#.NET)
    问题 我正在创建一个C#Windows窗体应用程序,当用户填写一些窗体并将数据保存在Access数据库中时,工作可以进行总结。 现在,我面临的问题是我必须将其作为安装文件传递给某人。 我在想的是,由于Access db的连接字符串,一旦安装在其他计算机上并执行的代码将给出错误,因为它与该计算机不匹配。 我知道,如果一个分布式项目,我可以将连接字符串放在app.config中,每个用户都可以根据他/她的机器进行更改。 但是,当我提供安装文件时,如何解决此问题。 回答1 假设您使用此连接字符串部署app.config "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\yourFile.accdb;" 在WinForms应用程序中|DataDirectory| 快捷方式代表您的应用程序工作文件夹,但是您可以在运行时更改指向该代码的位置。 // appdomain setup information AppDomain currentDomain = AppDomain.CurrentDomain; //Create or update a value pair for the appdomain currentDomain.SetData("DataDirectory", "Your user choosen
  • 在MVC4中添加控制器不起作用(Add Controller in MVC4 not working)
    问题 我正在使用VS 2010 Premium。 我有一个使用SqlCe 4.0和实体框架模型的MVC4项目。 型号是: public class ProjectBuild { public int ProjectBuildID {get;set;} public string name {get;set;} } public class ProjectBuildContext:DbContext { public DbSet<ProjectBuild> builds {get;set;} } 以下是我的连接字符串: add name="ProjectBuildContext" connectionString="Data Source=|DataDirectory|DB.sdf" providerName="System.Data.SqlServerCe.4.0" 当我也尝试使用内置脚手架创建新控制器时,出现以下错误: “无法为ProjectBuild检索元数据。”不支持使用相同的DbCompiledModel来针对不同类型的数据库服务器创建上下文,而是为所使用的每种服务器类型创建一个单独的DbCompiledModel。 回答1 我尝试了Fontanka16解决方案,但没有成功,事实证明我的DbContext类缺少定义目标CE数据库的默认构造函数。 这些是我的步骤摘要: