2016-06-13 45 views
1

我最近更新了一個ASP.NET 5項目以使用ASP.NET Core(RC2)和實體框架核心。到目前爲止,除了小小的細微差別之外,所有事情都還好,但是我嘗試更改其中一個表的名稱後,發現我的遷移嘗試引用不正確的表(即「MyProject.Models.Blog」而不只是「博客」)。實體框架核心:表名被映射爲包含命名空間

我一直在瀏覽一些文檔,並嘗試了一些東西,比如使用數據註釋。我的模型,建立一個類似它們是如何出現文檔中(使用不同的命名/數據具體到我的項目,但同樣的想法):

public class MyContext : DbContext 
{ 
    public DbSet<Blog> Blog { get; set; } 
    public DbSet<Post> Posts { get; set; } 

    protected override void OnModelCreating(ModelBuilder modelBuilder) 
    { 
     builder.Entity<Blog>(); 
     builder.Entity<Post>(); 
    } 
} 

public class Blog 
{ 
    public int BlogId { get; set; } 
    public string Url { get; set; } 
} 

public class Post 
{ 
    public int PostId { get; set; } 
    public string Title { get; set; } 
    public string Content { get; set; } 

    public int BlogId { get; set; } 
    public Blog Blog { get; set; } 
} 

所以,當我做出改變,去創建一個新的遷移,並查看生成的遷移文件,我可以看到migrationBuilder現在正試圖對「MyProject.Models.Post」表進行更改,而不是之前使用的「Post」表。在更新到Core之前,我做了一些遷移,並且自更新以來沒有更改我的模型,所以這是新行爲。

編輯:我應該注意到我目前在我的模型上使用了「[Table(」Post「)]」數據註釋,但它也沒有幫助解決問題。

編輯2:這裏是我的移民文件內容的鏈接(有名字改了) - http://pastebin.com/CZmXTBEM

回答

0

貌似有些問題與遷移。

在我的情況下,它的工作,你(和我)期望 - 表的名稱是從DbSet變量的名稱取(不鍵入像RC1),例如:

  • public DbSet<Blog> Blog { get; set; } EF核心創建Blog在我的Db表中,

  • public DbSet<Post> Posts { get; set; } EF Core在我的Db中創建Posts表。

然而,在我的情況下 - 我已經安裝RC2後創建的新/清潔工程,我將我的代碼,這個新項目......之後,我已經創造了新的移民......所以我有新/在RC2上創建的乾淨遷移。

我假設你在RC1上創建的遷移很少,並且在將項目遷移到RC2後創建了新的遷移 - 也許這裏有問題嗎?


你能告訴我你的遷移文件的代碼嗎?

  • 但是,請包括文件,不要貼在這裏的所有代碼;)
  • 或者你可以給他連接你的代碼存儲庫。



您也可以嘗試類似的東西(它的解決方案,其他的問題,但可能可以在你的情況幫也 - 這不是由我測試):

foreach (var entity in modelBuilder.Model.GetEntityTypes()) 
{ 
    entity.Relational().TableName = entity.DisplayName(); 
} 



仍 - 在我看來 - 這不是預期的情況。

您可以閱讀更多有關形式RC1遷移到RC2和有關更改在下表中命名,但我還沒有找到關於這種行爲的任何提及:

+0

感謝您的回覆。我不知道如何附加一個文件,所以這裏是一個鏈接到內容 - http://pastebin.com/CZmXTBEM。我將一些名稱替換爲「Blog」和「Post」。 – Blake

+0

謝謝,但爲什麼'我將一些名稱替換爲「Blog」和「Post」。我想看到所有的遷移文件(沒有以任何方式修改)... –

+0

但沒有足夠的信息來解決這個問題,但是...您可以嘗試刪除所有遷移(首先進行備份),然後創建新的(乾淨的)遷移在RC2上。 –

0

雷莫對舊遷移和舊快照進行修復會解決問題。

+0

太好了。我建議將此答案標記爲已解決/解決方案 - 這將有助於未來的其他人;) –

1

如果你不想刪除舊的遷移(你可能沒有,如果你有一個現有的數據庫),這裏是需要做什麼:

  1. 把你的前EF-核心代碼快照
  2. 在您的模型類中,進行簡單的虛擬更改,如添加簡單屬性
  3. 添加虛擬偏移dotnet ef migrations add dummy。這將創建一個遷移並重新生成快照。
  4. 在快照中,刪除定義新創建列的代碼。
  5. 刪除遷移.cs文件,並將虛假更改恢復到您的模型。

就是這樣:新添加的遷移將使用正確的表名。