【问题标题】:Entity Framework Database First regeneration make me lose manual changes实体框架数据库第一次重新生成让我失去了手动更改
【发布时间】:2025-12-12 21:55:01
【问题描述】:

我正在使用 MVC .NET 制作网站。

由于我是一个先学习设计数据库的老派程序员,所以我选择了数据库优先方法。我还使用“代码生成”来创建扩展名为 .tt 的文件。到目前为止,一切正常,除了一件让我烦恼的事情。

经典场景:

  • 我意识到我缺少一个字段
  • 我在数据库中添加了字段。
  • 我进入 edmx 并选择从数据库中更新模型。

然后我回到我的代码,并删除了我放在模型字段顶部的特殊 DisplayName 标记之类的东西。

例如,如果我有这个:

public partial class Blog
    {
        public Blog()
        {
            this.BlogComments = new HashSet<BlogComment>();
        }

        public int IDBlog { get; set; }
        public string Title { get; set; }

        [AllowHtml]
        public string Content { get; set; }
        public System.DateTime DateCreated { get; set; }
        public string Author { get; set; }

        public virtual ICollection<BlogComment> BlogComments { get; set; }
    }

会变成

public partial class Blog
    {
        public Blog()
        {
            this.BlogComments = new HashSet<BlogComment>();
        }

        public int IDBlog { get; set; }
        public string Title { get; set; }
        public string Content { get; set; }
        public System.DateTime DateCreated { get; set; }
        public string Author { get; set; }

        public virtual ICollection<BlogComment> BlogComments { get; set; }
    }

这是因为[AllowHtml] 是在上一代模型之后添加的。有没有办法更新表格而不删除我在生成后添加的所有标签?我怎样才能做到这一点?

现在,我通过使用 SVN 进行一些还原来解决这个问题,但它很快就会变得无法管理。

谢谢

【问题讨论】:

    标签: c# asp.net-mvc-3 entity-framework-4 database-first


    【解决方案1】:

    不要编辑生成的文件。曾经。只是。不。做。它。

    请改为在不同目录中的部分文件中进行编辑。要添加属性,请在分部类定义的顶部声明一个 Metadata 类。

    [MetadataType(typeof(BlogMetadata))]
    public partial class Blog
    {
        // it's possible to add logic and non-mapped properties here
    }
    

    现在在您的 Metadata 类中,您可以定义属性或其他逻辑:

    public class BlahMetadata
    {
        [AllowHtml] 
        public string Content{ get; set; } 
    }
    

    【讨论】:

    • 非常有趣!很快就会试试这个!
    • 这毫无意义,也没有解释(无论如何对我来说)这是如何解决问题的。不用我猜你能不能给一个更详细的例子
    • 嗯,首先,Database First 在当前的 EF 中已被弃用,但话虽如此,MetadataType 属性仍然有用。这个想法是您希望将谈论实体的事物(即验证规则、必需、错误消息等)与实体本身(您希望成为一个干净、轻量级的 POCO)分开。因此,在您的 POCO(实体)中,您添加了 MetadataType 属性,该属性指向定义元数据属性的类。对于 POCO 中的每个属性,您在元数据类中添加相同的属性,并使用定义所需行为的属性。
    【解决方案2】:

    不,没有办法编辑生成的代码并且在重新生成时不替换它。这就是为什么代码到处都有警告说不要编辑它的原因。

    但是,您可以使用部分类来添加额外的功能。如果您不知道分部类是什么,请在此处阅读:

    http://msdn.microsoft.com/en-us/library/wa80x488(v=vs.80).aspx

    如果要添加属性,则必须使用一种特殊的局部类,称为“伙伴类”。

    http://hartzer.wordpress.com/2010/01/26/mvc-buddy-class/

    【讨论】: