EF Core 与 MySQL:迁移和关系配置详解
<div class="dad65929"><div class="_4f9bf79 d7dc56a8 _43c05b5">
<div class="ds-message _63c77b1">
<div class="ds-markdown">
<p>本文将详细讲解EF Core与MySQL的关系配置和迁移,包括一对一、一对多、多对多关系的配置,使用Fluent API进行关系配置,处理迁移中的常见问题,以及数据种子的方法。</p>
<h2>1. EF Core 中的关系类型</h2>
<p class="ds-markdown-paragraph">Entity Framework Core 支持三种主要的关系类型:</p>
<h3>一对一关系 (One-to-One)</h3>
<p class="ds-markdown-paragraph">一个实体实例只与另一个实体实例相关联。例如:一个用户有一个用户资料。</p>
<div class="md-code-block md-code-block-light">
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> User
{
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">int</span> Id { <span style="color: rgba(0, 0, 255, 1)">get</span>; <span style="color: rgba(0, 0, 255, 1)">set</span><span style="color: rgba(0, 0, 0, 1)">; }
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">string</span> Username { <span style="color: rgba(0, 0, 255, 1)">get</span>; <span style="color: rgba(0, 0, 255, 1)">set</span><span style="color: rgba(0, 0, 0, 1)">; }
</span><span style="color: rgba(0, 0, 255, 1)">public</span> UserProfile Profile { <span style="color: rgba(0, 0, 255, 1)">get</span>; <span style="color: rgba(0, 0, 255, 1)">set</span>; } <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 导航属性</span>
<span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> UserProfile
{
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">int</span> Id { <span style="color: rgba(0, 0, 255, 1)">get</span>; <span style="color: rgba(0, 0, 255, 1)">set</span><span style="color: rgba(0, 0, 0, 1)">; }
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">string</span> FullName { <span style="color: rgba(0, 0, 255, 1)">get</span>; <span style="color: rgba(0, 0, 255, 1)">set</span><span style="color: rgba(0, 0, 0, 1)">; }
</span><span style="color: rgba(0, 0, 255, 1)">public</span> DateTime DateOfBirth { <span style="color: rgba(0, 0, 255, 1)">get</span>; <span style="color: rgba(0, 0, 255, 1)">set</span><span style="color: rgba(0, 0, 0, 1)">; }
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">int</span> UserId { <span style="color: rgba(0, 0, 255, 1)">get</span>; <span style="color: rgba(0, 0, 255, 1)">set</span>; } <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 外键</span>
<span style="color: rgba(0, 0, 255, 1)">public</span> User User { <span style="color: rgba(0, 0, 255, 1)">get</span>; <span style="color: rgba(0, 0, 255, 1)">set</span>; } <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 导航属性</span>
}</pre>
</div>
</div>
<h3>一对多关系 (One-to-Many)</h3>
<p class="ds-markdown-paragraph">一个实体实例与多个另一个实体实例相关联。例如:一个博客有多篇文章。</p>
<div class="md-code-block md-code-block-light">
<div class="md-code-block-banner-wrap">
<div class="md-code-block-banner md-code-block-banner-lite">
<div class="_121d384">
<div class="d2a24f03">
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Blog
{
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">int</span> Id { <span style="color: rgba(0, 0, 255, 1)">get</span>; <span style="color: rgba(0, 0, 255, 1)">set</span><span style="color: rgba(0, 0, 0, 1)">; }
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">string</span> Title { <span style="color: rgba(0, 0, 255, 1)">get</span>; <span style="color: rgba(0, 0, 255, 1)">set</span><span style="color: rgba(0, 0, 0, 1)">; }
</span><span style="color: rgba(0, 0, 255, 1)">public</span> List<Post> Posts { <span style="color: rgba(0, 0, 255, 1)">get</span>; <span style="color: rgba(0, 0, 255, 1)">set</span>; } <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 导航属性</span>
<span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Post
{
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">int</span> Id { <span style="color: rgba(0, 0, 255, 1)">get</span>; <span style="color: rgba(0, 0, 255, 1)">set</span><span style="color: rgba(0, 0, 0, 1)">; }
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">string</span> Title { <span style="color: rgba(0, 0, 255, 1)">get</span>; <span style="color: rgba(0, 0, 255, 1)">set</span><span style="color: rgba(0, 0, 0, 1)">; }
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">string</span> Content { <span style="color: rgba(0, 0, 255, 1)">get</span>; <span style="color: rgba(0, 0, 255, 1)">set</span><span style="color: rgba(0, 0, 0, 1)">; }
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">int</span> BlogId { <span style="color: rgba(0, 0, 255, 1)">get</span>; <span style="color: rgba(0, 0, 255, 1)">set</span>; } <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 外键</span>
<span style="color: rgba(0, 0, 255, 1)">public</span> Blog Blog { <span style="color: rgba(0, 0, 255, 1)">get</span>; <span style="color: rgba(0, 0, 255, 1)">set</span>; } <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 导航属性</span>
}</pre>
</div>
</div>
</div>
</div>
</div>
</div>
<h3>多对多关系 (Many-to-Many)</h3>
<p class="ds-markdown-paragraph">多个实体实例与多个另一个实体实例相关联。例如:一个学生可以选多门课程,一门课程可以有多个学生。</p>
<div class="md-code-block md-code-block-light">
<div class="md-code-block-banner-wrap">
<div class="md-code-block-banner md-code-block-banner-lite">
<div class="_121d384">
<div class="d2a24f03">
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Student
{
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">int</span> Id { <span style="color: rgba(0, 0, 255, 1)">get</span>; <span style="color: rgba(0, 0, 255, 1)">set</span><span style="color: rgba(0, 0, 0, 1)">; }
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">string</span> Name { <span style="color: rgba(0, 0, 255, 1)">get</span>; <span style="color: rgba(0, 0, 255, 1)">set</span><span style="color: rgba(0, 0, 0, 1)">; }
</span><span style="color: rgba(0, 0, 255, 1)">public</span> List<Course> Courses { <span style="color: rgba(0, 0, 255, 1)">get</span>; <span style="color: rgba(0, 0, 255, 1)">set</span>; } <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 导航属性</span>
<span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Course
{
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">int</span> Id { <span style="color: rgba(0, 0, 255, 1)">get</span>; <span style="color: rgba(0, 0, 255, 1)">set</span><span style="color: rgba(0, 0, 0, 1)">; }
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">string</span> Title { <span style="color: rgba(0, 0, 255, 1)">get</span>; <span style="color: rgba(0, 0, 255, 1)">set</span><span style="color: rgba(0, 0, 0, 1)">; }
</span><span style="color: rgba(0, 0, 255, 1)">public</span> List<Student> Students { <span style="color: rgba(0, 0, 255, 1)">get</span>; <span style="color: rgba(0, 0, 255, 1)">set</span>; } <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 导航属性</span>
<span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 连接实体(EF Core 5.0+ 可以隐式处理,但显式定义更灵活)</span>
<span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> StudentCourse
{
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">int</span> StudentId { <span style="color: rgba(0, 0, 255, 1)">get</span>; <span style="color: rgba(0, 0, 255, 1)">set</span><span style="color: rgba(0, 0, 0, 1)">; }
</span><span style="color: rgba(0, 0, 255, 1)">public</span> Student Student { <span style="color: rgba(0, 0, 255, 1)">get</span>; <span style="color: rgba(0, 0, 255, 1)">set</span><span style="color: rgba(0, 0, 0, 1)">; }
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">int</span> CourseId { <span style="color: rgba(0, 0, 255, 1)">get</span>; <span style="color: rgba(0, 0, 255, 1)">set</span><span style="color: rgba(0, 0, 0, 1)">; }
</span><span style="color: rgba(0, 0, 255, 1)">public</span> Course Course { <span style="color: rgba(0, 0, 255, 1)">get</span>; <span style="color: rgba(0, 0, 255, 1)">set</span><span style="color: rgba(0, 0, 0, 1)">; }
</span><span style="color: rgba(0, 0, 255, 1)">public</span> DateTime EnrollmentDate { <span style="color: rgba(0, 0, 255, 1)">get</span>; <span style="color: rgba(0, 0, 255, 1)">set</span><span style="color: rgba(0, 0, 0, 1)">; }
}</span></pre>
</div>
</div>
</div>
</div>
</div>
</div>
<h2>2. 使用 Fluent API 配置关系</h2>
<p class="ds-markdown-paragraph">Fluent API 提供了更精细的控制方式来配置关系:</p>
<div class="md-code-block md-code-block-light">
<div class="md-code-block-banner-wrap">
<div class="md-code-block-banner md-code-block-banner-lite">
<div class="_121d384">
<div class="d2a24f03">
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">protected</span> <span style="color: rgba(0, 0, 255, 1)">override</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> OnModelCreating(ModelBuilder modelBuilder)
{
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 一对一关系配置</span>
modelBuilder.Entity<User><span style="color: rgba(0, 0, 0, 1)">()
.HasOne(u </span>=><span style="color: rgba(0, 0, 0, 1)"> u.Profile)
.WithOne(up </span>=><span style="color: rgba(0, 0, 0, 1)"> up.User)
.HasForeignKey</span><UserProfile>(up =><span style="color: rgba(0, 0, 0, 1)"> up.UserId);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 一对多关系配置</span>
modelBuilder.Entity<Blog><span style="color: rgba(0, 0, 0, 1)">()
.HasMany(b </span>=><span style="color: rgba(0, 0, 0, 1)"> b.Posts)
.WithOne(p </span>=><span style="color: rgba(0, 0, 0, 1)"> p.Blog)
.HasForeignKey(p </span>=><span style="color: rgba(0, 0, 0, 1)"> p.BlogId)
.OnDelete(DeleteBehavior.Cascade); </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 级联删除
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 多对多关系配置 (EF Core 5.0+)</span>
modelBuilder.Entity<Student><span style="color: rgba(0, 0, 0, 1)">()
.HasMany(s </span>=><span style="color: rgba(0, 0, 0, 1)"> s.Courses)
.WithMany(c </span>=><span style="color: rgba(0, 0, 0, 1)"> c.Students)
.UsingEntity</span><StudentCourse><span style="color: rgba(0, 0, 0, 1)">(
j </span>=> j.HasOne(sc => sc.Course).WithMany().HasForeignKey(sc =><span style="color: rgba(0, 0, 0, 1)"> sc.CourseId),
j </span>=> j.HasOne(sc => sc.Student).WithMany().HasForeignKey(sc =><span style="color: rgba(0, 0, 0, 1)"> sc.StudentId),
j </span>=><span style="color: rgba(0, 0, 0, 1)">
{
j.HasKey(sc </span>=> <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> { sc.StudentId, sc.CourseId });
j.Property(sc </span>=> sc.EnrollmentDate).HasDefaultValueSql(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">CURRENT_TIMESTAMP</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
});
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 配置索引</span>
modelBuilder.Entity<Post><span style="color: rgba(0, 0, 0, 1)">()
.HasIndex(p </span>=><span style="color: rgba(0, 0, 0, 1)"> p.Title)
.IsUnique();
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 配置表名和列名</span>
modelBuilder.Entity<User><span style="color: rgba(0, 0, 0, 1)">()
.ToTable(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Users</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
.Property(u </span>=><span style="color: rgba(0, 0, 0, 1)"> u.Username)
.HasColumnName(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">user_name</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
.HasMaxLength(</span><span style="color: rgba(128, 0, 128, 1)">50</span><span style="color: rgba(0, 0, 0, 1)">);
}</span></pre>
</div>
</div>
</div>
</div>
</div>
</div>
<div>
<h2><span class="cu-line-clamp-default">3、EF Core 配置字段长度或精度</span></h2>
</div>
<div class="item-container_62BMH">
<div class="content-box_1t3WR">
<div class="markdown-wrapper_4CcPR">
<div class="dqa-markdown_5emil ">
<div class="markdown_1jK8o ">
<p>在Entity Framework Core (EF Core)中,配置字段长度或精度涉及到如何在模型中指定数据库列的属性。EF Core通过数据注解(Data Annotations)或Fluent API提供了多种方式来实现这一需求。下面将分别介绍如何使用这两种方法。</p>
<h3>使用数据注解</h3>
<p>在模型类中,你可以使用如<code class="dqa-code-span"></code>、<code class="dqa-code-span"></code>等属性来指定字段的长度或精度。</p>
<ul>
<li><strong>示例:使用<code class="dqa-code-span"></code></strong></li>
</ul>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.ComponentModel.DataAnnotations;
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Product
{
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">int</span> Id { <span style="color: rgba(0, 0, 255, 1)">get</span>; <span style="color: rgba(0, 0, 255, 1)">set</span><span style="color: rgba(0, 0, 0, 1)">; }
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">string</span> Name { <span style="color: rgba(0, 0, 255, 1)">get</span>; <span style="color: rgba(0, 0, 255, 1)">set</span><span style="color: rgba(0, 0, 0, 1)">; }
}</span></pre>
</div>
<ul>
<li>
<p><strong>示例:使用<code class="dqa-code-span"><br></code></strong></p>
</li>
</ul>
<div class="code-header">
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.ComponentModel.DataAnnotations.Schema;
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Product
{
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">int</span> Id { <span style="color: rgba(0, 0, 255, 1)">get</span>; <span style="color: rgba(0, 0, 255, 1)">set</span><span style="color: rgba(0, 0, 0, 1)">; }
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">string</span> Name { <span style="color: rgba(0, 0, 255, 1)">get</span>; <span style="color: rgba(0, 0, 255, 1)">set</span><span style="color: rgba(0, 0, 0, 1)">; }
}</span></pre>
</div>
</div>
<h3>使用Fluent API</h3>
<p>在DbContext的<code class="dqa-code-span">OnModelCreating</code>方法中,你可以使用Fluent API来配置字段的长度或精度。</p>
<ul>
<li><strong>示例:使用Fluent API配置字段长度</strong></li>
</ul>
<div class="code-header">
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">protected</span> <span style="color: rgba(0, 0, 255, 1)">override</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity</span><Product>(entity =><span style="color: rgba(0, 0, 0, 1)">
{
entity.Property(e </span>=><span style="color: rgba(0, 0, 0, 1)"> e.Name)
.HasMaxLength(</span><span style="color: rgba(128, 0, 128, 1)">100</span><span style="color: rgba(0, 0, 0, 1)">);
});
}</span></pre>
</div>
</div>
<ul>
<li><strong>示例:使用Fluent API指定列类型(包括精度和长度)<br></strong></li>
</ul>
<div class="code-header">
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">protected</span> <span style="color: rgba(0, 0, 255, 1)">override</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity</span><Product>(entity =><span style="color: rgba(0, 0, 0, 1)">
{
entity.Property(e </span>=><span style="color: rgba(0, 0, 0, 1)"> e.Price)
.HasColumnType(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">decimal(18,2)</span><span style="color: rgba(128, 0, 0, 1)">"</span>); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 例如,设置价格字段为decimal类型,总共18位,其中2位是小数部分<br> //.HasPrecision(18, 2); // 确保同时使用HasPrecision来指定精度和长度</span>
<span style="color: rgba(0, 0, 0, 1)"> });
}</span></pre>
</div>
</div>
<h3>注意事项</h3>
<ul>
<li>
<div class="dqa-li-inner">
<p><strong class="ai-core-answer wd-highlight c-fwb-big">数据类型映射</strong>:确保你指定的数据类型与数据库中的类型兼容。例如,使用<code class="dqa-code-span">decimal(18,2)</code>时,确保数据库支持这种类型。对于不支持的类型,如某些NoSQL数据库,可能需要自定义存储方式。</p>
</div>
</li>
<li>
<div class="dqa-li-inner">
<p><strong class="ai-core-answer wd-highlight c-fwb-big">迁移</strong>:当你修改了模型并希望更新数据库时,确保运行了迁移命令(如<code class="dqa-code-span">Add-Migration</code>和<code class="dqa-code-span">Update-Database</code>)。EF Core会根据模型中的配置自动生成或更新数据库表结构。</p>
</div>
</li>
<li>
<div class="dqa-li-inner">
<p><strong class="ai-core-answer wd-highlight c-fwb-big">性能和设计</strong>:在设计数据库和模型时,考虑到性能和设计需求。例如,对于非常大的文本字段,使用<code class="dqa-code-span">TEXT</code>类型而非<code class="dqa-code-span">VARCHAR(N)</code>可以更高效地存储大量文本数据。</p>
</div>
</li>
</ul>
<p>通过以上方法,你可以灵活地配置EF Core中的字段长度或精度,以适应不同的应用需求。</p>
</div>
</div>
</div>
</div>
</div>
<h2>4. 处理迁移中的常见问题</h2>
<h3>创建和应用迁移</h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)"># 创建迁移
dotnet ef migrations add AddRelationships
# 应用迁移
dotnet ef database update
# 回滚迁移
dotnet ef database update PreviousMigrationName
# 删除最后一次迁移
dotnet ef migrations remove</span></pre>
</div>
<h3>解决迁移冲突</h3>
<p class="ds-markdown-paragraph">当多个开发人员同时创建迁移时,可能会产生冲突。解决方法:</p>
<ol start="1">
<li>
<p class="ds-markdown-paragraph">协调团队成员,确保一次只有一个人创建迁移</p>
</li>
<li>
<p class="ds-markdown-paragraph">使用 <code>dotnet ef migrations script</code> 生成SQL脚本,手动合并更改</p>
</li>
<li>
<p class="ds-markdown-paragraph">删除冲突的迁移,重新创建</p>
</li>
</ol>
<h3>处理模型更改后的迁移</h3>
<p class="ds-markdown-paragraph">当模型更改后,EF Core 可能无法自动检测所有更改。解决方法:</p>
<ol start="1">
<li>
<p class="ds-markdown-paragraph">仔细检查生成的迁移代码</p>
</li>
<li>
<p class="ds-markdown-paragraph">手动修改迁移文件以包含所有必要的更改</p>
</li>
<li>
<p class="ds-markdown-paragraph">使用 <code>dotnet ef migrations add</code> 创建新的迁移</p>
</li>
</ol>
<h3>处理外键约束问题</h3>
<div class="md-code-block md-code-block-light">
<div class="md-code-block-banner-wrap">
<div class="md-code-block-banner md-code-block-banner-lite">
<div class="_121d384">
<div class="d2a24f03">
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 在迁移中处理外键约束</span>
<span style="color: rgba(0, 0, 0, 1)">migrationBuilder.AddForeignKey(
name: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">FK_Posts_Blogs_BlogId</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
table: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Posts</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
column: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">BlogId</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
principalTable: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Blogs</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
principalColumn: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Id</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
onDelete: ReferentialAction.Cascade);</span></pre>
</div>
</div>
</div>
</div>
</div>
</div>
<h3>处理MySQL特定的迁移问题</h3>
<div class="md-code-block md-code-block-light">
<div class="md-code-block-banner-wrap">
<div class="md-code-block-banner md-code-block-banner-lite">
<div class="_121d384">
<div class="d2a24f03">
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 在迁移中处理MySQL特定配置</span>
migrationBuilder.AlterColumn<<span style="color: rgba(0, 0, 255, 1)">string</span>><span style="color: rgba(0, 0, 0, 1)">(
name: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Title</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
table: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Posts</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
type: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">varchar(255)</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
maxLength: </span><span style="color: rgba(128, 0, 128, 1)">255</span><span style="color: rgba(0, 0, 0, 1)">,
nullable: </span><span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">,
collation: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">utf8mb4_unicode_ci</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
oldClrType: </span><span style="color: rgba(0, 0, 255, 1)">typeof</span>(<span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">),
oldType: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">longtext</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
oldNullable: </span><span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">)
.Annotation(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">MySql:CharSet</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">utf8mb4</span><span style="color: rgba(128, 0, 0, 1)">"</span>);</pre>
</div>
</div>
</div>
</div>
</div>
</div>
<h2>5. 数据种子 (Seed Data)</h2>
<h3>在迁移中配置种子数据</h3>
<div class="md-code-block md-code-block-light">
<div class="md-code-block-banner-wrap">
<div class="md-code-block-banner md-code-block-banner-lite">
<div class="_121d384">
<div class="d2a24f03">
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 在迁移的Up方法中添加种子数据</span>
<span style="color: rgba(0, 0, 255, 1)">protected</span> <span style="color: rgba(0, 0, 255, 1)">override</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.InsertData(
table: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Blogs</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
columns: </span><span style="color: rgba(0, 0, 255, 1)">new</span>[] { <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Id</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Title</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> },
values: </span><span style="color: rgba(0, 0, 255, 1)">new</span> <span style="color: rgba(0, 0, 255, 1)">object</span>[] { <span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Default Blog</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> });
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 在迁移的Down方法中移除种子数据</span>
<span style="color: rgba(0, 0, 255, 1)">protected</span> <span style="color: rgba(0, 0, 255, 1)">override</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DeleteData(
table: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Blogs</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
keyColumn: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Id</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
keyValue: </span><span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
}</span></pre>
</div>
</div>
</div>
</div>
</div>
</div>
<h3>在DbContext中配置种子数据</h3>
<div class="md-code-block md-code-block-light">
<div class="md-code-block-banner-wrap">
<div class="md-code-block-banner md-code-block-banner-lite">
<div class="_121d384">
<div class="d2a24f03">
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">protected</span> <span style="color: rgba(0, 0, 255, 1)">override</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity</span><Blog><span style="color: rgba(0, 0, 0, 1)">().HasData(
</span><span style="color: rgba(0, 0, 255, 1)">new</span> Blog { Id = <span style="color: rgba(128, 0, 128, 1)">1</span>, Title = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Default Blog</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> },
</span><span style="color: rgba(0, 0, 255, 1)">new</span> Blog { Id = <span style="color: rgba(128, 0, 128, 1)">2</span>, Title = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Secondary Blog</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> }
);
modelBuilder.Entity</span><Post><span style="color: rgba(0, 0, 0, 1)">().HasData(
</span><span style="color: rgba(0, 0, 255, 1)">new</span> Post { Id = <span style="color: rgba(128, 0, 128, 1)">1</span>, Title = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">First Post</span><span style="color: rgba(128, 0, 0, 1)">"</span>, Content = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Hello World</span><span style="color: rgba(128, 0, 0, 1)">"</span>, BlogId = <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)"> },
</span><span style="color: rgba(0, 0, 255, 1)">new</span> Post { Id = <span style="color: rgba(128, 0, 128, 1)">2</span>, Title = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Second Post</span><span style="color: rgba(128, 0, 0, 1)">"</span>, Content = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">EF Core is awesome</span><span style="color: rgba(128, 0, 0, 1)">"</span>, BlogId = <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)"> }
);
}</span></pre>
</div>
</div>
</div>
</div>
</div>
</div>
<h3>使用自定义初始化逻辑</h3>
<div class="md-code-block md-code-block-light">
<div class="md-code-block-banner-wrap">
<div class="md-code-block-banner md-code-block-banner-lite">
<div class="_121d384">
<div class="d2a24f03">
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> DbInitializer
{
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> Initialize(ApplicationDbContext context)
{
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 确保数据库已创建</span>
<span style="color: rgba(0, 0, 0, 1)"> context.Database.EnsureCreated();
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 检查是否已有数据</span>
<span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (context.Blogs.Any())
{
</span><span style="color: rgba(0, 0, 255, 1)">return</span>; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 数据库已经 seeded</span>
<span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 添加初始数据</span>
<span style="color: rgba(0, 0, 255, 1)">var</span> blogs = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Blog[]
{
</span><span style="color: rgba(0, 0, 255, 1)">new</span> Blog{Title=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Technology Blog</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">},
</span><span style="color: rgba(0, 0, 255, 1)">new</span> Blog{Title=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Food Blog</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">}
};
</span><span style="color: rgba(0, 0, 255, 1)">foreach</span> (<span style="color: rgba(0, 0, 255, 1)">var</span> blog <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> blogs)
{
context.Blogs.Add(blog);
}
context.SaveChanges();
</span><span style="color: rgba(0, 0, 255, 1)">var</span> posts = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Post[]
{
</span><span style="color: rgba(0, 0, 255, 1)">new</span> Post{Title=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Introduction to EF Core</span><span style="color: rgba(128, 0, 0, 1)">"</span>, Content=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">...</span><span style="color: rgba(128, 0, 0, 1)">"</span>, BlogId=<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">},
</span><span style="color: rgba(0, 0, 255, 1)">new</span> Post{Title=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Best Pizza Recipe</span><span style="color: rgba(128, 0, 0, 1)">"</span>, Content=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">...</span><span style="color: rgba(128, 0, 0, 1)">"</span>, BlogId=<span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">}
};
</span><span style="color: rgba(0, 0, 255, 1)">foreach</span> (<span style="color: rgba(0, 0, 255, 1)">var</span> post <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> posts)
{
context.Posts.Add(post);
}
context.SaveChanges();
}
}</span></pre>
</div>
</div>
</div>
</div>
</div>
</div>
<h3>在应用程序启动时调用初始化</h3>
<div class="md-code-block md-code-block-light">
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 在Program.cs或Startup.cs中</span>
<span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span> Main(<span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">[] args)
{
</span><span style="color: rgba(0, 0, 255, 1)">var</span> host =<span style="color: rgba(0, 0, 0, 1)"> CreateHostBuilder(args).Build();
</span><span style="color: rgba(0, 0, 255, 1)">using</span> (<span style="color: rgba(0, 0, 255, 1)">var</span> scope =<span style="color: rgba(0, 0, 0, 1)"> host.Services.CreateScope())
{
</span><span style="color: rgba(0, 0, 255, 1)">var</span> services =<span style="color: rgba(0, 0, 0, 1)"> scope.ServiceProvider;
</span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)">
{
</span><span style="color: rgba(0, 0, 255, 1)">var</span> context = services.GetRequiredService<ApplicationDbContext><span style="color: rgba(0, 0, 0, 1)">();
DbInitializer.Initialize(context);
}
</span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (Exception ex)
{
</span><span style="color: rgba(0, 0, 255, 1)">var</span> logger = services.GetRequiredService<ILogger<Program>><span style="color: rgba(0, 0, 0, 1)">();
logger.LogError(ex, </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">An error occurred while seeding the database.</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
}
}
host.Run();
}</span></pre>
</div>
</div>
<h2>6. 处理复杂场景</h2>
<h3>条件种子数据</h3>
<div class="md-code-block md-code-block-light">
<div class="md-code-block-banner-wrap">
<div class="md-code-block-banner md-code-block-banner-lite">
<div class="_121d384">
<div class="d2a24f03">
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> Initialize(ApplicationDbContext context)
{
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 只在开发环境中添加测试数据</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> (Environment.GetEnvironmentVariable(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">ASPNETCORE_ENVIRONMENT</span><span style="color: rgba(128, 0, 0, 1)">"</span>) == <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Development</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
{
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(0, 0, 0, 1)">context.Blogs.Any())
{
context.Blogs.AddRange(
</span><span style="color: rgba(0, 0, 255, 1)">new</span> Blog { Title = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Test Blog 1</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> },
</span><span style="color: rgba(0, 0, 255, 1)">new</span> Blog { Title = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Test Blog 2</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> }
);
context.SaveChanges();
}
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 在所有环境中添加必要的基础数据</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(0, 0, 0, 1)">context.Roles.Any())
{
context.Roles.AddRange(
</span><span style="color: rgba(0, 0, 255, 1)">new</span> Role { Name = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Administrator</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> },
</span><span style="color: rgba(0, 0, 255, 1)">new</span> Role { Name = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">User</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> }
);
context.SaveChanges();
}
}</span></pre>
</div>
</div>
</div>
</div>
</div>
</div>
<h3>使用JSON文件存储种子数据</h3>
<div class="md-code-block md-code-block-light">
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> Initialize(ApplicationDbContext context)
{
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(0, 0, 0, 1)">context.Blogs.Any())
{
</span><span style="color: rgba(0, 0, 255, 1)">var</span> seedDataPath = Path.Combine(Directory.GetCurrentDirectory(), <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">SeedData</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">var</span> blogsJson = File.ReadAllText(Path.Combine(seedDataPath, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">blogs.json</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">));
</span><span style="color: rgba(0, 0, 255, 1)">var</span> blogs = JsonSerializer.Deserialize<List<Blog>><span style="color: rgba(0, 0, 0, 1)">(blogsJson);
context.Blogs.AddRange(blogs);
context.SaveChanges();
}
}</span></pre>
</div>
</div>
<h2>总结</h2>
<p class="ds-markdown-paragraph">本文详细介绍了EF Core与MySQL中的关系配置、迁移处理和种子数据管理。关键点包括:</p>
<ol start="1">
<li>
<p class="ds-markdown-paragraph">使用Fluent API精细配置一对一、一对多和多对多关系</p>
</li>
<li>
<p class="ds-markdown-paragraph">正确处理迁移创建、应用和回滚</p>
</li>
<li>
<p class="ds-markdown-paragraph">解决迁移过程中的常见问题</p>
</li>
<li>
<p class="ds-markdown-paragraph">使用多种方法添加和管理种子数据</p>
</li>
<li>
<p class="ds-markdown-paragraph">处理复杂场景如条件种子数据和外部数据源</p>
</li>
</ol>
<p class="ds-markdown-paragraph">正确配置关系和迁移是构建健壮数据访问层的关键,而合理的种子数据策略可以大大简化开发和测试过程。</p>
<p class="ds-markdown-paragraph"> </p>
</div>
</div>
</div>
</div><br><br>
来源:https://www.cnblogs.com/jixingsuiyuan/p/19094052
頁:
[1]