17

这篇文章已经被注意到

这个也有

在我的开发机器上,我试图使用包管理器控制台中的 update-database 重新创建我的数据库。我相信我已按照上述帖子中的说明进行操作。

我收到此错误消息:

发生文件激活错误。物理文件名“\WRDatabase.mdf”可能不正确。诊断并更正其他错误,然后重试该操作。创建数据库失败。无法创建列出的某些文件名。检查相关错误。

我正在运行的命令是:

update-database -ConfigurationTypeName WRConfiguration  -ConnectionStringName localWR -Verbose

请注意,在上面的命令中,我传递了一个连接字符串名称,并且似乎正在使用连接字符串,因为 .mdf 文件的名称出现在错误消息中。

有趣的是,我能够运行我的代码并创建了我的数据库,但是它使用错误的名称创建(它被命名为“VIN.DataModel.WRContext”,这是 DbContext 的完整命名空间和类名)。我的猜测是,当我的代码运行时,EF 找不到用于创建数据库的连接字符串。这是有意的,因为我会将这个上下文映射到在服务器上运行的数据库以及在本地计算机上运行的数据库的副本(即,我将为同一个 DbContext 提供两个连接字符串)。

这是应用程序配置:

<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
  <parameters>
    <parameter value="v11.0" />
  </parameters>
</defaultConnectionFactory>
</entityFramework>
<connectionStrings>
     <add name="localWR" providerName="System.Data.SqlClient" connectionString="Data Source=(LocalDB)\v11.0;Initial Catalog =WRDatabase;AttachDBFilename=|DataDirectory|\WRDatabase.mdf; Integrated Security=True;MultipleActiveResultSets=True" />
</connectionStrings>

在 Configuration 类的构造函数中将 AutomaticMigrationsEnabled 设置为 false。

这是上下文类:

public class WRContext : DbContext
{
    static WRContext()
    {
        Database.SetInitializer(new MigrateDatabaseToLatestVersion<WRContext, VIN.DataModel.WRMigrations.WRConfiguration>());
    }

    public WRContext()
    {

    }

    public WRContext(string connectionString)
        : base(connectionString)
    { 

    }


    public DbSet<Emp> Emps { get; set; }
    public DbSet<Inv> Invs { get; set; }
    public DbSet<WRConfig> WRConfigs { get; set; }
}  
4

6 回答 6

39

我在这里找到了答案:

http://kazimnami.azurewebsites.net/techblog/2012/11/24/error-a-file-activation-error-occurred-create-database-failed/

谢谢卡齐姆。

当“|DataDirectory|”时抛出异常 不评估连接字符串中的属性。要解决此问题,请在您的代码中添加以下行:

AppDomain.CurrentDomain.SetData("DataDirectory", System.IO.Directory.GetCurrentDirectory());
于 2013-09-19T15:11:19.737 回答
14

实际上,您需要将 OP 的答案给出的行放在扩展xxContext: dbContext类中。

public class WRContext : DbContext
{
    public WRContext()
        : base("localWR")
    {
        AppDomain.CurrentDomain.SetData("DataDirectory", System.IO.Directory.GetCurrentDirectory());
    }
    public DbSet<Emp> Emps { get; set; }
    //....
}
于 2015-10-17T09:36:58.040 回答
2

对我来说,问题是我从(localdb)实例转移到了一个可靠的 SQL 服务器实例。为了让 update-database 创建所需的数据库,我必须删除 ;AttachDBFilename=|DataDirectory|\somedatabase.mdf

完全然后其他一切都按预期工作

于 2017-06-11T18:29:05.620 回答
1

就我而言,只是它想要放置数据库文件的文件夹不存在。显然,由于某种原因,Visual Studio 无法为您创建目录。

于 2019-06-24T10:19:01.800 回答
0

如果先前的答案是正确的,则可以通过命令行轻松设置

Update-Database -AppDomainBaseDirectory C:\you-path
于 2014-05-26T19:27:27.523 回答
0

如果您进行集成测试,则使用通用控制器方法来设置目录。请参阅 StefanG 的回答。

            public static T SetupController<T>() where T : ApiController, new()
            {
                //LocalDB database to the tests directory.
                AppDomain.CurrentDomain.SetData("DataDirectory", System.IO.Directory.GetCurrentDirectory());

                var request = new HttpRequestMessage();

                var config = WebApiConfig.SetupRegister(new HttpConfiguration());

                var controller = new T()
                {
                    Request = request,
                    Configuration = config
                };

                return controller;
            }
于 2017-12-20T19:50:48.177 回答