我想在 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 变量才能从表中选择数据。
我对您问题的解决方案是添加另一个名为 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 不同。