簡體   English   中英

實體框架代碼第一次更新 - 數據庫在CREATE DATABASE上失敗

[英]Entity Framework code first update-database fails on CREATE DATABASE

這篇文章已被注意到

這個也是

在我的開發機器上,我嘗試使用包管理器控制台中的update-database重新創建我的數據庫。 我相信我已按照上述帖子中的說明進行操作。

我收到此錯誤消息:

發生文件激活錯誤。 物理文件名'\\ WRDatabase.mdf'可能不正確。 診斷並更正其他錯誤,然后重試該操作。 CREATE DATABASE失敗。 無法創建列出的某些文件名。 檢查相關錯誤。

我正在運行的命令是:

update-database -ConfigurationTypeName WRConfiguration  -ConnectionStringName localWR -Verbose

請注意,在上面的命令中,我傳遞了一個連接字符串名稱,並且看起來正在使用連接字符串,因為.mdf文件的名稱出現在錯誤消息中。

有趣的是,我能夠運行我的代碼並且我的數據庫已經創建,但它是用錯誤的名稱創建的(它名為“VIN.DataModel.WRContext”,它是DbContext的完整命名空間和類名)。 我的猜測是,當我的代碼運行時,EF無法找到用於創建數據庫的連接字符串。 這是故意的,因為我將此上下文映射到在服務器上運行的數據庫以及在本地計算機上運行的db的副本(即,我將為同一個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; }
}  

我在這里找到了答案:

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

謝謝kazim。

“| DataDirectory |”時拋出異常 不評估連接字符串中的屬性。 要解決此問題,請在代碼中添加以下行:

AppDomain.CurrentDomain.SetData("DataDirectory", System.IO.Directory.GetCurrentDirectory());

實際上你需要將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; }
    //....
}

如果以前的答案是正確的,很容易通過命令行設置它

Update-Database -AppDomainBaseDirectory C:\you-path

對我來說,問題是我從一個(localdb)實例轉移到一個可靠的SQL服務器實例。 為了讓update-database創建我必須刪除的所需數據庫;AttachDBFilename=|DataDirectory|\\somedatabase.mdf

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

如果您正在進行集成測試,那么使用通用控制器方法來設置目錄。 請參閱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;
            }

在我的情況下,它只是想要放入數據庫文件的文件夾不存在。 顯然,visual studio無法出於某種原因為您創建目錄。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM