【问题标题】:Entity Framework Inserting Initial Data On Rebuild实体框架在重建时插入初始数据
【发布时间】:2022-01-17 05:33:27
【问题描述】:
我将实体框架代码优先用于 MySQL 数据源。
我已将ContactType.cs 定义如下:
public class ContactType
{
[Key]
public int ContactTypeId { get; set; }
[Required, StringLength(30)]
public string DisplayName { get; set; }
}
我的问题是,在我重建数据库之后,我如何让 EF 将一些联系人类型(没有 SQL)插入到数据库中。通常,数据库被重建为空白模式,但我想添加联系人类型,如(家庭、移动、办公室、传真)。
【问题讨论】:
标签:
c#
mysql
entity-framework
【解决方案1】:
您创建一个自定义数据库初始化程序并覆盖 Seed 方法
public class MyContextInitializer
: DropCreateDatabaseIfModelChanges<MyContext>
{
protected override void Seed(MyContext context)
{
context.ContactTypes.Add(new ContactType { DisplayName = "Home" });
context.ContactTypes.Add(new ContactType { DisplayName = "Mobile" });
context.ContactTypes.Add(new ContactType { DisplayName = "Office" });
context.ContactTypes.Add(new ContactType { DisplayName = "Fax" });
//EF will call SaveChanges itself
}
}
然后你为你的派生上下文注册这个初始化器MyContext:
Database.SetInitializer<MyContext>(new MyContextInitializer());
这是Database 类的静态方法,应该在应用程序启动时调用一次。您还可以将其放入上下文的静态构造函数中,以确保在创建第一个上下文实例之前设置初始化程序:
static MyContext()
{
Database.SetInitializer<MyContext>(new MyContextInitializer());
}
您也可以从DropCreateDatabaseAlways<T> 或CreateDatabaseIfNotExists<T> 派生而不是基本初始化程序DropCreateDatabaseIfModelChanges<T>,如果这更能满足您的需求。