修复迁移时的外键设计错误

时间:2019-02-10 11:15:22

标签: c# .net-core entity-framework-core

我有以下情况,我的设计看起来像这样,数据库中已经有一些数据。

if (this.refreshTokenInProgress) {
    return this.refreshTokenSubject
        .filter(result => result !== null)
        .pipe(
            take(1),
            switchMap(() => {
                return this.getTokenObservable().pipe(switchMap((user_tokens) => {
                    return next.handle(this.addToken(user_tokens, request));
                }));
            }),
            tap(evt => {
                this.loaderService.storeLoaderOff();
            })
        )
} else {
    this.refreshTokenInProgress = true;
    this.refreshTokenSubject.next(null);
    return this.refreshAccessToken().pipe(
        switchMap((token: any) => {
            this.refreshTokenInProgress = false;
            this.refreshTokenSubject.next(token.access_token);
            return this.getTokenObservable().pipe(switchMap((user_tokens) => {
                return next.handle(this.addToken(user_tokens, request)).pipe(tap(evt => {
                    //  this.loaderService.storeLoaderOff();

                }))
            }));
        }),
        catchError((err: any) => {
            this.loaderService.storeLoaderOff();
            this.refreshTokenInProgress = false;
            this.authService.logoutUser();
            return throwError(error);
        })
    );
}

后来我意识到这是我的错误,设计实际上应该是:

public class MyContext : DbContext
{
    public DbSet<MyEntity> MyEntities { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlite("Data Source=database.db");
    }
}

public class MyEntity
{
    public int MyEntityId { get; set; }

    public int MetaEntityId { get; set; }

    public MetaEntity MetaEntity { get; set; }
}

public class MetaEntity
{
    public int MetaEntityId { get; set; }
}

在不丢失实体之间关系的情况下应用此迁移的最佳方法是什么?迁移Up()方法内部有什么方法可以记住关系,更改数据库架构然后重新应用关系?

1 个答案:

答案 0 :(得分:0)

好,所以我找到了解决方案(在SQLite中不起作用!,上面的代码只是一个示例,实际的生产数据库是MySQL)。

在新迁移中,在创建新列之后并在删除旧列之前将其移至正确位置:

migrationBuilder.Sql("UPDATE MetaEntity " +
                             "INNER JOIN MyEntity ON MetaEntity.MetaEntityId = MyEntity.MetaEntityId " +
                             "SET MetaEntity.MyEntityId = MyEntity.MyEntityId;");