2010-02-02 138 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