我正在使用实体框架DbContext使用数据库第一种方法构建ASP.NET MVC Web应用程序。
如果在某些条件下我需要修改数据库,例如添加新表或修改现有表(添加列或更改列数据类型),我应该:
我应该如何处理修改数据库架构的任务?
被修改 例如,我有以下在.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
答案 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并使用数据库中的更新,这是将更改从数据库推送到您的代码的唯一正确方法。