【发布时间】:2012-01-30 22:38:30
【问题描述】:
我正在使用实体框架 DbContext 使用数据库优先方法构建一个 ASP.NET MVC Web 应用程序。
如果在某些情况下我需要修改数据库,例如添加新表或修改现有表(添加列或更改列数据类型),我应该:
- 删除现有实体 .edmx 和 .tt 文件夹并重新创建映射
- 修改数据库后手动将修改应用到.tt文件夹下的模型类
- 这两个选项均无效。
我应该如何处理修改我的数据库架构的任务?
已编辑 例如,我在 .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
【问题讨论】:
标签: asp.net-mvc-3 entity-framework