2013-06-25 33 views
0

我遵循這兩個教程來了解EF如何工作。
http://msdn.microsoft.com/en-us/data/jj193542
http://weblogs.asp.net/scottgu/archive/2010/07/16/code-first-development-with-entity-framework-4.aspx沒有任何connectionString自動創建localdb?

有這兩個教程之間的區別:第一個說,我沒有Web.config下創建的connectionString爲EF創建一個新的數據庫,但斯科特谷的教程說我需要至。

我成功與第一個:

namespace LearnDB.Models 
{ 
    public class Person 
    { 
     [Key] 
     public string Name { get; set; } 
     public int Age { get; set; } 
    } 
} 

namespace LearnDB.DAL 
{ 
    public class DBAccess : DbContext 
    { 
     public DbSet<Person> Persons { get; set; } 
    } 
} 

namespace LearnDB.Controllers 
{ 
    public class HomeController : Controller 
    { 
     public string Index() 
     { 
      var db = new DBAccess(); 
      var p = new Person { Name = "A", Age = 1 }; 
      db.Persons.Add(p); 
      db.SaveChanges(); 
      foreach (var per in db.Persons) 
      { 
       return per.Name; 
      } 
      return "hi"; 
     } 
    } 
} 

該程序成功運行。
但是,我想知道:
1.爲什麼我的程序成功沒有我添加任何connectionStrings?我以爲我必須添加
<add name="DBAccess" ...... />。如果沒有必要,爲什麼斯科特古說我應該添加它?
2.究竟是什麼觸發了數據庫的自動創建?從我嘗試過的方式來看,數據庫不會在編譯或創建DbContext時創建,而只會在添加一些數據時創建。它是否正確?

回答

2

如果您不覆蓋或以其他方式指定實體框架,那麼默認情況下,實體框架會執行許多操作。這包括是否爲您創建數據庫,嘗試執行此操作的位置以及它將如何解釋您已放入DBContext的類。 http://msdn.microsoft.com/en-us/data/jj193542

再往:

既然你什麼也沒做,答案在您提供的第一個鏈接給出「?哪裏是我的數據」

由於您沒有做任何事情來覆蓋或定義您想要的設置,EF會嘗試爲您創建一個數據庫(如果不存在)。它說,如果你安裝了SQLExpress,它會嘗試使用它,但是如果沒有,它會嘗試使用LocalDB(這是一個更新的更輕的版本,對於開發人員來說是非常好的,可以最大限度地減少他們的開發佔用空間)。

Scott Guthrie的文章指出了另一個約定。它將使用與您的DBContext類相同的特定連接字符串作爲數據庫的連接字符串。然後,如果你沒有提供那個(你沒有)返回到第一篇文章,他們說他們會爲他們創建的新數據庫命名(在SQLExpress或LocalDB上): 「數據庫以派生上下文的完全限定名稱命名「。

基本上,你所做的只是爲了讓事情發展而需要的最少量。這不是一件壞事。這只是意味着所有的慣例都可能是神祕的。約定優於配置是一個很好的概念,但是當你甚至不知道爲你設置的設置時,這絕對是令人生畏的!

相關問題