Если нам необходимо, чтобы при первом обращении база данных уже была заполнена некоторыми начальными значениями, то мы можем произвести ее инициализацию.
Инициализация происходит при первом обращении к контексту данных.
Для инициализации мы можем использовать один из классов инициализаторов, которые имеются в библиотеке .NET:
- CreateDatabaseIfNotExists: инициализатор, используемый по умолчанию. Он не удаляет автоматчески базу данных и данные, а в случае изменения структуры моделей и контекста данных выбрасывает исключение.
- DropCreateDatabaseIfModelChanges: данный инициализатор проверяет на соответствие моделям определения таблиц в базе данных. И если модели не соответствуют определению таблиц, то база данные пересоздается
- DropCreateDatabaseAlways: этот инициализатор будет всегда пересоздавать базу данных.
Используем один из инициализаторов. Для этого нам надо переопределить метод Seed:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
class MyContextInitializer : DropCreateDatabaseAlways<MobileContext> { protected override void Seed(MobileContext db) { Phone p1 = new Phone {Name = "Samsung Galaxy S5", Price = 14000 }; Phone p2 = new Phone {Name = "Nokia Lumia 630", Price = 8000 }; db.Phones.Add(p1); db.Phones.Add(p2); db.SaveChanges(); } } public class Phone { public int Id { get; set; } public string Name { get; set; } public int Price { get; set; } } class MobileContext : DbContext { static MobileContext() { Database.SetInitializer<MobileContext>(new MyContextInitializer()); } public MobileContext() : base("DefaultConnection") { } public DbSet<Phone> Phones { get; set; } } |
Собственно инициализатор наследуется от одного из выше рассмотренных классов, который типизируется классом контекста: DropCreateDatabaseAlways<MobileContext>
.
Все действия по инициализации происходят в методе Seed, а сама инициализация предполагает простое сохранение данных в бд с помощью контекста данных.
Чтобы инициализатор сработал, надо его вызвать. Один из способов вызова инициализатора предполагет вызов его в статическом конструкторе класса контекста:
1 2 3 4 |
static MobileContext() { Database.SetInitializer<MobileContext>(new MyContextInitializer()); } |