2013-04-23 90 views
1

我有一個使用表單身份驗證的MVC4互聯網應用程序。MVC4項目 - 不能DropCreateDatabaseIfModelChanges

出在Account模型文件中創建UserProfile模型的盒子,我感動的是它自己的文件,並在我的DbContext文件名爲DbSet<UserProfile>。我期望EF創建一個2表數據庫,UserProfiles和Stories。

public class MySocialStoriesDb : DbContext 
{ 
    public DbSet<UserProfile> UserProfiles { get; set; } 
    public DbSet<Story> Stories { get; set; } 
} 

故事模式

[Table("Stories")] 
public class Story 
{ 
    [Key] 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    public int StoryId { get; set; } 

    public int UserId { get; set; } 

    [ForeignKey("UserId")] 
    public virtual UserProfile User { get; set; } 

    public string File { get; set; } 
    public DateTime DateCreated { get; set; } 
    public string Name { get; set; } 
} 

用戶配置型號

[Table("UserProfile")] 
public class UserProfile 
{ 
    [Key] 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    public int UserId { get; set; } 

    public string UserName { get; set; } 
    public string EmailAddress { get; set; } 
    public string UserDirectory { get; set; } 
    public bool Paid { get; set; } 
    public DateTime DatePaid { get; set; } 
    public string PaymentId { get; set; } 
} 

我已經運行從包管理器啓用的遷移,並允許自動遷移,並允許dataloss。生成的InitialCreate文件似乎只創建用戶配置文件表,它的代碼中沒有任何東西表。

添加以下行的Global.asax

Database.SetInitializer(new Models.IntializeMySocialStoriesDb()); 

如果我現在改變對數據庫的修改模型罷了。如果我手動刪除數據庫並將InitializeMySocialStoriesDb更改爲DropCreateDatabaseAlways,然後運行該應用程序,則不會創建數據庫。

我只是想知道我錯過了什麼。

回答

2

不要打擾這種機制。對於生產應用程序是不可行的,並且每次模式更改時都要求您提供所有數據。

而是將您的數據庫模式作爲單獨的SSDT項目創建,並使用DACPAC文件來初始部署和升級您的生產數據庫,同時保持所有數據不變。只需將SimpleMembership創建的表格複製到SSDT項目中即可。

這樣你就可以準確定義列定義,可以精確定義約束,精確定義外鍵,主鍵和唯一鍵等等,並且仍然可以通過應用程序項目中的Entity Framework訪問數據。升級生產數據庫上的模式只需要部署一個DACPAC。

開發過程中,當您在SSDT中進行更改時,Visual Studio將自動對錶結構進行任何更改。

簡而言之,我認爲代碼優先的定義過於鬆散,沒有組織和糟糕的主意。

+0

我想在開發期間使用EF生成所有的表結構。所以如果事情發生變化,在初始開發過程中字段會被添加等。無論如何,直到數據成爲現場數據都是垃圾。 – James 2013-04-23 11:09:50

+0

當您調試應用程序時,Visual Studio仍然會自動創建並更改表結構。您可以在SSDT中添加新字段(列),然後刷新您的EDMX。表格結構會自動改變,但仍然會改變數據。 SSDT項目也受源代碼控制,因此模式也受版本控制。 – Monstieur 2013-04-23 11:11:06

+0

我會稍微閱讀一下VS中的SQL Server數據庫項目(如果它只是一個單獨項目中的edmx,可能沒有太多東西要學習)。我在另一個項目中使用了代碼優先,沒有問題,但仍然有興趣查看這次使用它出了什麼問題。 – James 2013-04-23 11:16:02