2012-01-30 73 views
2

我建立使用数据库第一种方法使用实体框架的DbContext一个ASP.NET MVC的Web应用程序。数据库,第一种方法和修改数据库架构

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

  1. 删除现有的实体的.edmx和.tt文件夹并再次重新创建映射
  2. 修改数据库后手动将修改应用于.tt文件夹下的模型类
  3. 这两个选项都不是有效的。

我应该如何接近修改我的数据库架构的任务吗?

编辑 例如我有添加了* IsManagedBy *辅助methodand的[MetadataType(typeof运算其被自动的.TT文件夹下创建,考虑裸露以下部分类(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类中定义并我应该在自动生成的书部分类,这意味着它将如果被删除定义它我重新生成代码!!!

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

3.即使是[MetadataType(typeof运算(Books_validation))]其中i的自动生成的代码写到也将在我的情况下重新生成代码移除,因此这意味着,我必须去在所有修改类并为它们添加关联的MetadataType(typeof)。

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

回答

2

如果您在EDMX右键单击编辑器,应该有一个选项“从数据库更新模型。”如果您已删除数据库中的字段,你可能仍然需要将其删除,甚至删除其表,并通过“更新模型从数据库”菜单中重新添加它,但我觉得这不是删除整个EDMX和启动更容易每次新鲜。

更新

由于拉吉斯拉夫说,你永远不应该乱用自动生成的代码文件。正如您发现的那样,这些代码文件会自动重写。 Entity Framework的创建者预见到您遇到的问题,并提供了一种机制,您可以在不修改自动生成的.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文件重新生成模型数据时不会受到影响。

+0

我试图从数据库表中删除一个字段,然后我使用“从数据库更新模型”,我选择了我修改过的表格,但我注意到Visual Studio重新创建了表示修改过的模型类表和通过FK关系连接到这个表的所有类以及我在.tt文件夹下的类内创建的所有数据注释和帮助器方法都被删除了...所以我如何避免这两个问题(影响其他表格和保存数据注释和辅助方法)。 BR – 2012-01-30 23:17:13

+0

@johnG:我已经读了几次你的评论,恐怕我不明白你在说什么。它如何影响其他表格?你失去了哪些辅助方法?请用一些代码更新您的问题,以显示您正在讨论的内容的一些示例。 – StriplingWarrior 2012-01-31 00:01:51

+0

感谢StriplingWarrior,我编辑了我的帖子,使其更清晰。 BR – 2012-01-31 03:58:15

0

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

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

+0

但在我使用的DbContext模板的情况下,会的DbContext自动生成.tt文件夹中的部分类,所以我将无法为模型对象定义新的部分类,因为Visual Studio会引发该类已存在的错误!!! BR – 2012-01-31 15:24:41