• 11/02/2018
    • A

    • o

    • eu

本文 内容

数据 种子 是 用 初始 数据 集 填充 数据库 的 过程。

可以 通过 多种 方式 在 EF Core 中 完成 此 操作 :

  • 模型 种子 数据
  • 手动 迁移 自 定义
  • 自 定义 初始化 逻辑

模型 种子 数据

Core 在 EF6 中 不同 , 在 EF Core 中 , 种子 设定 数据 可以 作为 模型 配置 的 一部分 与 实体 类型 相关 联。 然后 EF Core 迁移 可以 自动 计算 在 将 数据库 升级 到 新 版本 的 模型 时 需要 应用 的 插入 、 更新或 删除 操作。

备注

迁移 仅 在 确定 应该 执行 哪种 操作 以 使 种子 数据 进入 所需 状态 考虑 模型 更改。 因此 , 在 迁移 外部 执行 的 数据 更改 可能 会 丢失 或 导致 错误。

On , 这 将为 中 的 配置 种子 数据 Blog OnModelCreating :

modelBuilder.Entity <Blog> () .HasData (Blog nou {BlogId = 1, Url = “http://sample.com”});

若要 添加 具有 关系 的 实体 , 需要 指定 外 键值 :

modelBuilder.Entity <Post> () .HasData (Postare noua {BlogId = 1, PostId = 1, Title = “Primul post”, Continut = “Test 1”});

如果 实体 类型 具有 隐藏 状态 的 任何 属性 , 则 可以 使用 匿名 类 提供 值 :

modelBuilder.Entity <Post> () .HasData (new {BlogId = 1, PostId = 2, Title = “Al doilea post”, Content = “Test 2”});

拥有 的 实体 类型 可以 采用 类似 的 方式 进行 种子 设定 :

modelBuilder.Entity <Post> () .OwnsOne (p => p.AuthorName) .HasData (new {PostId = 1, First = “Andriy”, Last = “Svyryd”}, new {PostId = 2, First = “Diego “, Last =” Vega “});

有关 更多 上下文 , 请 参阅 完整 的 示例 项目。

将 数据 添加 到 模型 后 , 应 使用 迁移 来 应用 更改。

提示

如果 需要 在 自动 部署 中 应用 迁移 , 可以 创建 一个 可 在 执行 前 预览 的 SQL 脚本。

或者 , 您 可以 使用 context.Database.EnsureCreated () 创建 包含 种子 数据 的 新 数据库 , 例如 , 对于 数据库 , 或 使用 内存 中 提供 程序 任何 非 关系 数据库 时。 请 注意 , 如果 数据库 已 存在 reat AssureC将 不会 更新 数据库 中 的 架构 或 种子 数据。 对于 关系 数据库 , EnsureCreated () 如果 计划 使用 迁移 , 则 不应 调用。

模型 种子 数据 的 限制

此 类型 的 种子 数据 由 迁移 管理 , 需要 在 不 连接 到 数据库 的 情况 下 生成 用于 更新 数据库 中 已 存在 的 数据 的 脚本。 这 会 施加 一些 限制 :

  • 主 键值 需要 指定 , 即使 它 通常 由 数据库 生成。 它 用于 检测 迁移 间 的 数据 更改。
  • 如果 以 任何 方式 更改 了 主 键 , 则将 删除 以前 的 种子 数据。

因此 , 此 功能 最适 用于 不需要 在 迁移 外 更改 的 静态 数据 , 并且 不 依赖 于 数据库 中 的 任何 其他 内容 (例如 , 邮政编码)。

如果 你 的 方案 包括 以下 任何 一种 情况 , 则 建议 使用 上 一部分 中 所述 的 自 定义 初始化 逻辑 :

  • 用于 测试 的 临时 数据
  • 依赖 于 数据库 状态 的 数据
  • 大量 (播种 数据 的 数据 会 在 迁移 快照 中 捕获 , 而 大 数据 则会 迅速 导致 大 文件 和 性能 下降)。
  • 需要 由 数据库 生成 的 键值 的 数据 , 包括 使用 替代 密钥 作为 标识 的 实体
  • 需要 自 定义 转换 (的 数据 , 该 转换 不) 值 转换 处理 , 如 某些 密码 哈希
  • 需要 调用 外部 API 的 数据 , 例如 Core ASP.NET 标识 角色 和 用户 创建

手动 迁移 自 定义

添加 迁移 时 , 对 指定 的 数据 所做 的 更改 将 HasData 转换 为 对 InsertData () 、 和 的 调用 UpdateData () DeleteData ()。 解决 某些 限制 的 一种 方法 HasData 是 手动 将 这些 调用 或 自 定义 操作 添加到 迁移。

migrationBuilder.InsertData (tabel: “Bloguri”, coloane: nou [] {“Url”}, valori: obiect nou [] {“http://generated.com”});

自 定义 初始化 逻辑

执行 数据 种子 设定 的 一种 简单 而 有效 的 方法 是 在 DbContext.SaveChanges () 主 应用 程序 逻辑 开始 执行 之前 使用。

folosind (var context = new DataSeedingContext ()) {context.Database.EnsureCreated (); var testBlog = context.Blogs.FirstOrDefault (b => b.Url == “http://test.com”); if (testBlog == null) {context.Blogs.Add (blog nou {Url = “http://test.com”}); } context.SaveChanges (); }

警告

种子 设定 代码 不应 是 正常 应用 执行 的 一部分 , 因为 这 可能 会 导致 多个 实例 运行 时 出现 性 问题 , 并且 还 要求 应用 有权 修改 数据库 架构。

根据 部署 的 约束 , 可以 通过 不同 的 方式 执行 初始化 代码 :

  • 在 本地 运行 初始化 应用 程序
  • 将 初始化 应用 与 主 应用 一起 部署 , 调用 初始化 例程 , 禁用 或 删除 初始化 应用。

通常 可以 使用 发布 配置 文件 自动 完成 此 配置。

la maison del amour malena la pugliese 2019
adriana chechik video malena la pugliese anal
penthouse modelle malena la pugliese anale
malena rocco xxx malena la pugliese ass
malena culo malena la pugliese black
salieri film porno malena la pugliese blowjob
moglie tradisce con nero malena la pugliese casting
casting italian porn malena la pugliese compilation
valentina nappi compilation malena la pugliese con max felicitas
centoxcento x videos malena la pugliese culo
vinny star malena la pugliese cum
culi bagnati malena la pugliese cumshot
malena la pugliese scene malena la pugliese doppio anal
orgia trav malena la pugliese double
roberta gemma new malena la pugliese double anal
male a porno malena la pugliese e max felicitas
film porn in streaming malena la pugliese e rocco siffredi
zozze porno malena la pugliese facial
siffredi hard academy porn malena la pugliese figa
xxx famiglia malena la pugliese film completo