2011-05-05 103 views
0

因此,首先我不知道我使用的實體框架版本是什麼。我假設它是4,但我該如何檢查?實體框架不會在數據庫中創建表格

其次,我有以下連接字符串在web.config中:

<connectionStrings> 

<add name="DBEntites" 
    connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true" 
    providerName="System.Data.SqlClient" /> 

<add name="ApplicationServices" 
    connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true" 
    providerName="System.Data.SqlClient" /> 

正如你可以看到他們是相同的DB。實際上它們是由asp.net成員提供商創建的數據庫。

現在我有以下型號:

public class Profile { 
    [Key] 
    public string username { get; set; } 

    [Display(Name = "Full Name")] 
    public string FullName { get; set; } 

} 

是不是很簡單?

然後我有下面的類連接到數據庫:

public class DBEntities : DbContext { 
     public DbSet<Profile> Profiles { get; set; } 
    } 

然後在我的賬戶控制器,事實上這是當你選擇一個新的MVC3項目由VS2010創建相同的控制器。

[HttpPost] 
public ActionResult Register(RegisterModel model) { 
      if (ModelState.IsValid) { 
       // Attempt to register the user 
       MembershipCreateStatus createStatus; 
       Membership.CreateUser(model.UserName, model.Password, model.Email, null, null, true, null, out createStatus); 
       Profile pm = new Profile(); 
       pm.username=model.UserName; 
       pm.FullName="unknown"; 

       db.Profiles.Add(pm); 
       db.SaveChanges(); 



       if (createStatus == MembershipCreateStatus.Success) { 
        FormsAuthentication.SetAuthCookie(model.UserName, false /* createPersistentCookie */); 
        return RedirectToAction("Index", "Home"); 
       } else { 
        ModelState.AddModelError("", ErrorCodeToString(createStatus)); 
       } 
      } 

      // If we got this far, something failed, redisplay form 
      return View(model); 
     } 

所以當我運行這個應用程序,它沒有例外運行。如果我添加一個新用戶,新用戶將被添加到asp.net成員資格表中。所以根據我的理解,Entity框架應該創建一個名爲「Profile」的表,其中包含兩列「username」和「fullname」。

但是,它不是。爲什麼代碼可以毫無例外地穿過,db.SaveChanges()可以通過,但是沒有創建表?

我在做什麼錯?

編輯:我認爲如果我嘗試創建一個具有相同用戶名的條目(顯然不能,因爲它是一個主鍵),那麼會引發異常,說該條目已經存在。

但我似乎找不到表!

回答

4

您正在使用EF 4.1並且預期行爲。您正在使用現有數據庫,在這種情況下,EF不會爲您創建表。具有默認功能的EF只能創建數據庫和所有表格。成員資格API不使用EF,因此您的第二個測試在成員身份(用戶名必須是唯一的)上未在EF上失敗。

要解決您的問題,您必須手動在數據庫中創建表,或者您必須讓EF創建數據庫會稍微困難一些,因爲它必須爲您創建所有相關的ASP.NET表。一種方法是將這些表腳本編寫爲外部SQL文件並在自定義初始化程序中執行該文件。對於自定義初始化程序,請檢查this answer。這種方式不喜歡包含GO命令的腳本。如果要使用GO命令的腳本,則必須使用SQL Server Management Objects來執行腳本(SMO)。

+0

如何創建一個單獨的數據庫? – masfenix 2011-05-06 19:12:05

+0

如果您希望EF爲您生成數據庫和表格,則不會創建任何數據庫。 – 2011-05-06 19:36:36