Подход с использованием базы данных и изменение схемы базы данных - PullRequest
2 голосов
/ 31 января 2012

Я создаю веб-приложение ASP.NET MVC с использованием структуры сущностей DbContext с использованием подхода, основанного на базе данных.

Если при определенных условиях мне нужно было изменить базу данных, например добавить новую таблицу или изменить существующую таблицу (добавить столбцы или изменить тип данных столбца), я должен:

  1. Удалите существующие папки сущностей .edmx и .tt и заново создайте сопоставление
  2. Вручную применить модификацию к классам моделей в папке .tt после изменения базы данных
  3. Ни один из этих двух вариантов не действителен.

Как мне подойти к задаче изменения схемы базы данных?

Отредактировано Например, у меня есть следующий частичный класс, который был автоматически создан в папке .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

Ответы [ 2 ]

2 голосов
/ 31 января 2012

Если щелкнуть правой кнопкой мыши в редакторе 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 голосов
/ 31 января 2012

Вы никогда не должны изменять автоматически сгенерированный код. Если вы это сделаете, вы все равно испортили весь рабочий процесс, потому что любое одно изменение в файле EDMX может удалить ваши изменения. Весь пользовательский код принадлежит вашей частичной части класса (например, он используется для добавления проверки аннотаций данных).

Как только вы выполните правильный рабочий процесс, вы сможете изменить EDMX и использовать обновление из базы данных, что является единственным правильным способом передачи изменений из базы данных в ваш код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...