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

Posted

技术标签:

【中文标题】实体框架在重建时插入初始数据【英文标题】: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)插入到数据库中。通常,数据库被重建为空白模式,但我想添加联系人类型,如(家庭、移动、办公室、传真)。

【问题讨论】:

【参考方案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&lt;T&gt;CreateDatabaseIfNotExists&lt;T&gt; 派生而不是基本初始化程序DropCreateDatabaseIfModelChanges&lt;T&gt;,如果这更能满足您的需求。

【讨论】:

以上是关于实体框架在重建时插入初始数据的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 重建表(rename)注意事项总结

实体框架数据库错误

oracle索引问题,删除再重建索引与索引分析

为啥以及何时需要在 MongoDB 中重建索引?

如何在没有 IOB 标签的情况下使用 Hugging Face 的转换器管道重建文本实体?

在 Sitecore 中重建链接数据库