实体框架在重建时插入初始数据

本文关键字:数据 插入 框架 重建 实体 | 更新日期: 2023-09-27 18:10:05

我首先使用实体框架代码和MySQL数据源。

我对ContactType.cs的定义如下:

public class ContactType
{
    [Key]
    public int ContactTypeId { get; set; }
    [Required, StringLength(30)]
    public string DisplayName { get; set; }
}

我的问题是,在我重建数据库后,如何让EF在数据库中插入(没有SQL(一些联系人类型。通常,DB被重建为一个空白模式,但我想添加联系人类型,如(Home、Mobile、Office、Fax(。

实体框架在重建时插入初始数据

创建自定义数据库初始值设定项并覆盖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>