2012-02-10 23 views
30

我開始玩的代碼,第一種方法的實體框架,主要目的是讓我可以裝飾在我看來,(否則我與註解顯示屬性,現在我要創建一個與實體框架爲我生成的類幾乎相同的類,以便我可以添加註釋,然後將數據從一個對象複製到下一個)。停止實體框架的修改數據庫

現在它看起來像當我開始我的應用程序它試圖創建一個數據庫。

我不想實體框架不斷修改我的數據庫。不,沒有。不要嘗試它。修改數據庫真的不難;如果我自己這樣做,我會感覺更舒適。設計數據庫時,我不需要一個框架來握住我的手。

我可以告訴框架來停止試圖修改我的數據庫?我現在很猶豫如何使用代碼,因爲它試圖修改我的數據庫是相當可怕的。即使在發展中,我也不想看到它發生。

我運氣不好嗎?

+1

這聽起來像你的模型不完全匹配您的數據庫。你可以嘗試使用你的數據庫的副本,並指出EF。讓它創建修改數據庫並比較差異,然後相應地修改您的模型。你還應該看看EntityTypeConfiguration泛型類。 – 2012-02-10 15:24:08

+0

修改架構或修改數據? – jrummell 2012-02-10 15:34:37

+0

我們中的一些人不相信這些自動遷移,並且從設計和設置數據庫的角度來看非常重要,以至於手動完成它是完全合理的。但是讓EDMX離我遠點......這樣做的另一個原因是:一個團隊可以在數據庫上工作,而另一個團隊設置類別/模型以匹配 - 大致平行。如果有任何變化,您不必搜索返回遷移。只需更新您的註釋等。 – mmcrae 2015-12-14 18:30:22

回答

46

如果你不想EF創建數據庫,您可以禁用數據庫初始化:

public class SchoolDBContext: DbContext 
{ 
    public SchoolDBContext() : base("SchoolDBConnectionString") 
    {    
     //Disable initializer 
     Database.SetInitializer<SchoolDBContext>(null); 
    } 
    public DbSet<Student> Students { get; set; } 
    public DbSet<Standard> Standards { get; set; } 
} 

http://www.entityframeworktutorial.net/code-first/turn-off-database-initialization-in-code-first.aspx

+1

您可以將其放在上下文類的靜態構造函數中,如以下示例視頻所示:http://msdn.microsoft.com/en-us/data/jj572367 – 2013-07-11 11:30:55

+1

它不會顯示在視頻中。看看這裏,而不是:在這個數據庫的前面,重要的是不要使用這個 – 2015-09-01 16:21:09

+1

這個答案可以改善與哪裏添加此代碼。 – 2015-09-18 15:00:16

3

如果你想使用EF但從來沒有修改數據庫,那麼你可能不想代碼第一。你可能首先想要更類似於數據庫的東西。從答案評論

http://blogs.msdn.com/b/adonet/archive/2011/03/15/ef-4-1-model-amp-database-first-walkthrough.aspx

鏈接:
http://automapper.codeplex.com/
Getting Started with AutoMapper

編輯:我誤解了目標,you should reference this answer where the following correct code was given:

If you don't want EF to create your database, you can disable the database initializer

Database.SetInitializer<MyContext>(null); 
+0

我同意數據庫首先*聽起來像我想要的,但我試圖解決必須創建與爲我生成的模型幾乎完全相同的類的問題。我必須創建一個幾乎完全相同的類,以便我可以裝飾具有註釋的屬性以在我的視圖中顯示(例如,執行驗證)。它導致我不得不遍歷所有「EF」對象,並將它們複製/映射到帶有註釋的新對象。 – 2012-02-10 15:33:26

+1

我會說,你永遠不應該傳遞你的db模型對象到你的視圖。通常,您將創建另一個類,然後將其傳遞給您的視圖,該視圖只包含可用於該視圖的屬性。然後你會用你的驗證屬性裝飾那個類 – 2012-02-10 15:37:22

+0

@AnthonyShaw - 我還沒有看到很多人做這個例子,但這正是我現在正在做的。我覺得我對此感到擔憂,因爲它好像很多世俗的複製/繪圖工作。是否有一種模式可用於將數據庫模型對象轉換爲對象以在視圖中顯示?你通常如何做? – 2012-02-10 15:39:17

2

當你說你真是初始化器,使用基類:

public class DatabaseInitialiser : CreateDatabaseIfNotExists<MyContext> 

而不是:

public class DatabaseInitialiser : RecreateDatabaseIfModelChanges<MyContext> 

或者,如果你使用:

Database.SetInitializer<MyContext>(new RecreateDatabaseIfModelChanges<MyContext>); 

與替換此:

Database.SetInitializer<MyContext>(new CreateDatabaseIfNotExists<MyContext>); 
1

由於code first幾乎完全符合您的描述,我不明白您的問題。

如果你不想讓EF擺弄你的數據庫,那麼你現有的數據庫就是generate a model

+0

沒錯,但是如果我從我的數據庫生成模型,那麼我缺少在視圖中顯示數據所需的數據註釋。它導致了很多重複的工作;從本質上創建與生成的模型相同的類,然後使用註釋修飾這些屬性。我正在努力避免涉及到的所有複製工作。 – 2012-02-10 15:29:47

+0

您可以通過創建部分類或夥伴類(MetadataAttribute)來修飾生成的類。 – jrummell 2012-02-10 15:38:05

+0

有些例子是你想要做的代碼其次,數據庫存在,但是關係不要或者你處理Views,而Code Second方法是必需的。 – 2016-07-15 03:48:47