数据库优先方法和修改数据库模式

时间:2012-01-30 22:38:30

标签: asp.net-mvc-3 entity-framework

我正在使用实体框架DbContext使用数据库第一种方法构建ASP.NET MVC Web应用程序。

如果在某些条件下我需要修改数据库,例如添加新表或修改现有表(添加列或更改列数据类型),我应该:

  1. 删除现有实体.edmx和.tt文件夹,然后重新创建映射
  2. 修改数据库
  3. 后,手动将修改应用于.tt文件夹下的模型类
  4. 这两个选项都不合法。
  5. 我应该如何处理修改数据库架构的任务?

    被修改 例如,我有以下在.tt文件夹下自动创建的部分类,请记住我添加了 * IsManagedBy * 辅助方法和[MetadataType(typeof) (Books_validation))]到它: -

    [MetadataType(typeof(Books_validation))]
        public partial class Book
        {
            public Book()
            {
                this.Assessments = new HashSet<Assessment>();
                this.Users_Books = new HashSet<Users_Books>();
            }
    
            public int BookID { get; set; }
    
    
            public string BookName { get; set; }
            public string ManagedBy { get; set; }
    
            public byte[] Timestamp { get; set; }
    
            public virtual ICollection<Assessment> Assessments { get; set; }
            public virtual User User { get; set; }
            public virtual ICollection<Users_Books> Users_Bookes { get; set; }
            public bool IsManagedBy(string userName)
            {
                return ManagedBy.Equals(userName,
                StringComparison.OrdinalIgnoreCase);
            }
    
        }
    

    然后我创建Book_validation类以应用如下数据注释: -

    public class Books_validation
    
        {
    
            [Required(ErrorMessage = "Name is required")]
            public string BookName { get; set; }
            public string ManagedBy { get; set; }
           [ConcurrencyCheck]
            [Timestamp]
           public Byte[] Timestamp { get; set; }
    
        }
    

    这种方法导致三个问题: -

    1。 IsManagedBy帮助器方法无法在Book_validation类中定义,我应该在自动生成的Book部分类中定义它,这意味着如果我重新生成代码,它将被删除!

    2. 例如,如果我修改与Book类相关的评估表(通过外键),然后我从.edmx设计器中选择“从数据库更新模型”选项;那么visual studio也会重新生成Book类,这会给我带来更多麻烦。

    3。即使我在自动生成的代码中编写的[MetadataType(typeof(Books_validation))]也将被删除,以防我重新生成代码,所以这意味着我必须去在所有修改过的类上添加相关的MetadataType(typeof)。

    当我使用ObjectContext模板时,所有这些问题都没有发生,因为ObjectContext模板不会自动生成部分类,它只会生成模型类,然后我可以为它们添加部分类和元类型...所以我认为最好回到ObjectContext而不是DBContext !!!,对此以及上述问题的任何建议? BR

2 个答案:

答案 0 :(得分:2)

如果右键单击EDMX编辑器,则应该有一个“从数据库更新模型”的选项。如果您已删除数据库中的字段,您可能仍需要删除它们,甚至删除它们的表并通过“从数据库更新模型”菜单重新添加它,但我发现这比删除整个edmx并开始更容易每次都很新鲜。

<强>更新

正如Ladislav所说,你永远不应该搞乱自动生成的代码文件。正如您所发现的那样,这些代码文件会自动重写。实体框架的创建者预见到了您所遇到的问题,并且他们提供了一种机制,您可以在不修改自动生成的.cs文件的情况下添加到这些类:部分类

部分类允许您创建跨多个文件的类定义,前提是它们都在同一名称空间和程序集中。因此,除了自动生成的Context.cs文件,您还可以创建其他文件:

  

Book.cs

[MetadataType(typeof(Books_validation))]
public partial class Book
{
    public bool IsManagedBy(string userName)
    {
        return ManagedBy.Equals(userName,
        StringComparison.OrdinalIgnoreCase);
    }
}

在编译程序集时,这个单独的类的单独定义的存在将导致此代码与自动生成的Book类有效地“合并”,但它允许您将这个特殊的自定义代码放在单独的文件中从EDMX文件重新生成模型数据时不会受到影响。

答案 1 :(得分:0)

您永远不应修改自动生成的代码。如果你这样做,你无论如何都破坏了整个工作流程,因为对EDMX文件的任何单一更改都可以删除你的更改。所有自定义代码都属于您自己的部分类(例如,它用于adding validation数据注释)。

一旦您遵循正确的工作流程,您就可以修改EDMX并使用数据库中的更新,这是将更改从数据库推送到您的代码的唯一正确方法。