C# 实体框架数据库首次重新生成使我丢失手动更改

C# 实体框架数据库首次重新生成使我丢失手动更改,c#,asp.net-mvc-3,entity-framework-4,database-first,C#,Asp.net Mvc 3,Entity Framework 4,Database First,我正在用MVC.NET制作一个网站 因为我是一个老派程序员,首先学习设计数据库,所以我选择了数据库优先的方法。我还使用了“代码生成”,它创建扩展名为.tt的文件。到目前为止,除了一件让我心烦意乱的事情外,一切都正常 经典场景: 我意识到我错过了一个领域 我将该字段添加到数据库中 我进入edmx并选择从数据库更新模型 然后我回到我的代码中,用来工作的东西,比如我放在模型字段顶部的特殊DisplayName标签,都被删除了 例如,如果我有: public partial class Blog

我正在用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; }
    }
公共部分类博客
{
公共博客()
{
this.blogcoments=newhashset();
}
public int IDBlog{get;set;}
公共字符串标题{get;set;}
[allowtml]
公共字符串内容{get;set;}
public System.DateTime DateCreated{get;set;}
公共字符串作者{get;set;}
公共虚拟ICollection 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; }
    }
公共部分类博客
{
公共博客()
{
this.blogcoments=newhashset();
}
public int IDBlog{get;set;}
公共字符串标题{get;set;}
公共字符串内容{get;set;}
public System.DateTime DateCreated{get;set;}
公共字符串作者{get;set;}
公共虚拟ICollection BlogComments{get;set;}
}
这是因为
[allowtml]
是在上一代模型之后添加的。是否有一种方法可以更新表而不删除生成后添加的所有标记?我该怎么做

现在,我通过使用SVN进行一些恢复来管理这一点,但它很快将无法管理


谢谢

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

相反,在不同目录中的部分文件中进行编辑。要添加属性,请在部分类定义的顶部声明元数据类

[MetadataType(typeof(BlogMetadata))]
public partial class Blog
{
    // it's possible to add logic and non-mapped properties here
}
现在,在元数据类中,您可以定义属性或其他逻辑:

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

不,无法编辑生成的代码,也无法在重新生成时将其替换。这就是为什么代码到处都有警告,说不要编辑它

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

如果您想添加属性,那么您必须使用一种称为“buddy类”的特殊部分类


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