Я создаю веб-приложение ASP.NET MVC с использованием структуры сущностей DbContext с использованием подхода, основанного на базе данных.
Если при определенных условиях мне нужно было изменить базу данных, например добавить новую таблицу или изменить существующую таблицу (добавить столбцы или изменить тип данных столбца), я должен:
- Удалите существующие папки сущностей .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 также возродит класс Книги, что доставит мне больше хлопот.
3. Даже [MetadataType (typeof (Books_validation))]], который я написал в автоматически сгенерированном коде, также будет удален в случае, если я регенерирую код, так что это означает, что мне нужно перейти все измененные классы и добавьте связанный с ними MetadataType (typeof).
Все эти проблемы не возникали, когда я использовал шаблон ObjectContext, поскольку шаблон ObjectContext не будет автоматически генерировать частичные классы, он будет генерировать только классы моделей, а затем я могу добавить частичные классы и тип метаданных для них ... так Я думаю, что лучше вернуться обратно в ObjectContext, а не DBContext !!!, какие-либо предложения по этой и вышеуказанным проблемам?
BR