在迁移中使用 DbContext

问题描述 投票:0回答:1

我想在 Migration Up 方法中使用 DbContext 变量。

我更好地解释了我的问题: 我以这种方式完成了一次迁移

class Circle {
    public int Id {get; set;}
    public int Radius {get; set;}
}

class Figure {
    public int Id {get; set;}
    public List<Circle> Circles {get; set;}
}

class GeometryDbContext: DbContext{
    public DbSet<Figure> Figures {get; set;}

    protected override void OnModelCreating(ModelBuilder modelBuilder) {
        modelBuilder.Entity<Figure>()
            .Property(e => e.Circles)
            .HasConversion(
                v => JsonConvert.SerializeObject(v),
                v => JsonConvert.DeserializeObject<List<Circle>>(v) ?? new List<Circle()
            )
            .HasColumnName("Circles");
    }
}

通过这种方式,我只有一个名为“Figures”的表,其中有一个名为“Circles”的 varchar 列,其中存储了“Circles”的字符串化版本。

现在我想更新它,这样:

class Circle {
    public int Id {get; set;}
    public int Radius {get; set;}

    public int IdFigure {get; set;}
        
    [ForeignKey(nameof(IdFigure))]
    public Figure? Figure {get; set;}
}

class Figure {
    public int Id {get; set;}
    public List<Circle> Circles {get; set;}
}

class GeometryDbContext: DbContext{
    public DbSet<Figure> Figures {get; set;}
    public DbSet<Circle> Circles {get; set;}

    protected override void OnModelCreating(ModelBuilder modelBuilder) { }
}

这样我就有了两个通过外键链接的表。

如何自定义创建的Migration类的Up方法,使“Circles”列中存储的所有数据都传递到“Circles”表中?

附注我有一个 PSQL 数据库,并且我正在使用实体框架代码优先

我尝试使用migrationBuilder.Sql创建选择查询,但我发现你不能在迁移类中执行此操作。

我发现我需要在迁移类中创建一个 dbContext 变量才能从表中选择数据。

c# .net entity-framework ef-code-first psql
1个回答
0
投票

我对您问题的解决方案是添加另一个名为 Circle2:

的类
class Figure
{
    public int Id {get; set;}
    public List<Circle> Circles {get; set;}
}

class Circle
{
    public int Id {get; set;}
    public int Radius {get; set;}        
}

public class Circle2
{        
    public int Id { get; set; }
    public int Radius { get; set; }
    public int FigureId { get; set; }
    public Figure Figure { get; set; }
}

显然还有另一行 DbSet:

DbSet<Circle2> Circle2s { get; set; } 

也到您的 DbContext。并且,在将新的 Circle2 空表添加到数据库的迁移之后,您可以仅执行一次以下代码片段:

foreach (var figure in db.Figures)
{
    foreach (var cir in figure.Circles)
    {
        Circle2 myCircle = new Circle2()
        {                
            Radius = cir.Radius,
            FigureId = figure.Id
        };
        db.Circle2s.Add(myCircle);
    }
}
                    
db.SaveChanges();

这样做,您将使用 Figure 表中所有图形的所有圆来填充新的 Circle2 表,并且您也从图形到 Circle2 建立了新的 一对多 关系,在正确的方法。

之后,如果您愿意,我认为您将需要另一次迁移,消除旧的“Circles”列(来自图形表)及其 OnModelCreating 方法中的旧关系。

注意新 Circle2s 表上的 Id 是“自动生成”的,因此它们与旧的 Figure.Circles 集合中的 Id 不同。

© www.soinside.com 2019 - 2024. All rights reserved.