2010-02-02 215 views
14

我在我的數據庫中有一個名爲CompanyDetails的表格。它有一個名爲CharacterID varchar(255)的列。我只是將它從NOT NULL列更改爲NULL列。我在模型瀏覽器以及EDMX文件查看器中運行了'從數據庫更新模型...'命令。這是它在設計器創建:實體框架 - 從數據庫更新模型... - 沒有更新發生!

/// <summary> 
/// There are no comments for Property CharacterId in the schema. 
/// </summary> 
[global::System.Data.Objects.DataClasses.EdmScalarPropertyAttribute(IsNullable=false)] 
[global::System.Runtime.Serialization.DataMemberAttribute()] 
public string CharacterId 
{ 
    get 
    { 
     return this._CharacterId; 
    } 
    set 
    { 
     this.OnCharacterIdChanging(value); 
     this.ReportPropertyChanging("CharacterId"); 
     this._CharacterId = global::System.Data.Objects.DataClasses.StructuralObject.SetValidValue(value, false); 
     this.ReportPropertyChanged("CharacterId"); 
     this.OnCharacterIdChanged(); 
    } 
} 
private string _CharacterId; 
partial void OnCharacterIdChanging(string value); 
partial void OnCharacterIdChanged(); 
/// <summary> 
/// There are no comments for Property URLDomain in the schema. 
/// </summary> 
[global::System.Data.Objects.DataClasses.EdmScalarPropertyAttribute()] 
[global::System.Runtime.Serialization.DataMemberAttribute()] 
public string URLDomain 
{ 
    get 
    { 
     return this._URLDomain; 
    } 
    set 
    { 
     this.OnURLDomainChanging(value); 
     this.ReportPropertyChanging("URLDomain"); 
     this._URLDomain = global::System.Data.Objects.DataClasses.StructuralObject.SetValidValue(value, true); 
     this.ReportPropertyChanged("URLDomain"); 
     this.OnURLDomainChanged(); 
    } 
} 
private string _URLDomain; 
partial void OnURLDomainChanging(string value); 
partial void OnURLDomainChanged(); 

你會發現,它有一個屬性:

[global::System.Data.Objects.DataClasses.EdmScalarPropertyAttribute(IsNullable=false)] 

我還包括了一個屬性,你會發現它被正確標記爲:

[global::System.Data.Objects.DataClasses.EdmScalarPropertyAttribute()] 

什麼給?我如何在我的數據庫模式中進行簡單的更改,並根據這些更改真正讓實體框架更新?!我不得不每次都改變模型並重新創建模型!

回答

18

實體框架使用XML文件(EDMX)來指定數據庫方案和映射。當你點擊「從數據庫更新模型」時,它就是這個已更新的edmx文件。

接下來,當您編譯您的應用程序時,會解析此edmx文件並生成您正在查看的支持類,因此如果要查看支持類中反映的更改,則需要更新模型,然後重新編譯。

最後,你還必須記住edmx包含3件事情。

  1. 數據庫/存儲方案(SSDL)
  2. 概念模型(CSDL)
  3. (MSL)

更新數據庫,然後點擊 「更新」,將概念與存儲之間的映射更新SSDL但不一定會自動將所需的更改自動發送到概念模型,您可能需要打開edmx是設計人員並檢查該字段的屬性。 (完全可以將可空的數據庫字段映射到不可空的概念字段,但顯然在這種情況下,這不是你想要的)。

+0

+1。這是對的。如果您已經在CSDL中生成了一個屬性,則必須手動更新它。但SSDL將始終從頭開始重新生成。 EF假設你想要你的CSDL定製。 – 2010-02-03 01:58:33

+4

謝謝克雷格。作爲一個額外的說明,我相信你可以在開關/模式下使用edmgen工具(http://msdn.microsoft.com/en-us/library/bb387165.aspx):FromSSDLGeneration或者/ mode:FullGeneration來強制生成CSDL + MSL或所有塊,如果這是您需要的。 – 2010-02-03 10:29:41

+0

我在哪裏可以找到這3個文件,並且每次進行這樣的更改時是否必須手動編輯它們?我在硬盤上搜索過,根本找不到這些文件,所以想知道它們是否是內部生成的,如果是,我該如何打開它們? (什麼是newb問題!):) – 2010-02-03 16:04:56