【问题标题】:Entity Framework - Update Model From Database... - no update happens!实体框架 - 从数据库更新模型... - 没有更新发生!
【发布时间】:2010-02-03 08:21:39
【问题描述】:

我的数据库中有一个名为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()]

什么给了?如何在我的数据库架构中进行简单的更改,并真正让实体框架根据这些更改进行更新?!每次发生变化时,我都不得不删除并重新创建模型!

【问题讨论】:

    标签: .net entity-framework updatemodel


    【解决方案1】:

    实体框架使用 XML 文件(edmx)来指定数据库方案和映射。当您单击“从数据库更新模型”时,更新的是这个 edmx 文件。

    接下来,当您编译您的应用程序时,会解析此 edmx 文件并生成您正在查看的支持类,因此如果您想看到支持类中反映的更改,您需要更新模型,然后重新编译.

    最后,你还必须记住 edmx 包含 3 个东西。

    1. 数据库/存储方案 (SSDL)
    2. 概念模型 (CSDL)
    3. 概念与存储 (MSL) 之间的映射

    更新数据库并单击“更新”将更新 SSDL,但不一定会自动对概念模型进行所需的更改,您可能需要打开 edmx 是设计器并检查字段上的属性。 (完全可以将一个可为空的数据库字段映射到一个不可为空的概念字段,但显然在这种情况下这不是您想要的)。

    【讨论】:

    • +1。这是正确的。如果您已经在 CSDL 中生成了属性,则必须手动更新它。但 SSDL 总是会从头开始重新生成。 EF 假定您需要 CSDL 自定义。
    • 谢谢克雷格。作为一个额外的说明,我相信你可以使用工具 edmgen (msdn.microsoft.com/en-us/library/bb387165.aspx) 和开关 /mode:FromSSDLGeneration 或 /mode:FullGeneration 来强制生成 CSDL+MSL 或所有块,如果这是你需要的。
    • 我在哪里可以找到这 3 个文件,每次进行这样的更改时我必须手动编辑它们吗?我在我的硬盘驱动器上进行了搜索,根本找不到这些文件,所以想知道它们是否是内部生成的,如果是,我该如何打开它们? (多么新的问题!):)
    • 正如 Simon 所说,所有三个部分都是 EDMX 文件的一部分。在解决方案探索中右键单击您的模型,选择打开方式,然后选择 XML 编辑器。
    • @Keith。您可以手动编辑 edmx xml(有时我发现它更容易),但大多数事情都可以通过 GUI 完成。您会注意到您可以在主屏幕中的每个类属性上设置可空值(选择字段并按 F4 以显示属性),但是如果您查看模型窗口,您还可以浏览数据库表并展开每个字段并在每个数据库字段上设置为空。
    猜你喜欢
    • 2011-04-28
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-05
    • 2011-03-04
    • 1970-01-01
    • 2015-09-21
    相关资源
    最近更新 更多