c# - 使用新的 EF Core 5.0 将一对多迁移到多对多
问题描述
我有一个 ASP.NET Core 5 项目(从 ASP.NET Core 3.1 迁移而来)。该项目使用 EF Core。
EF Core 5 内置了对多对多的支持。我首先从 3.1 迁移到 5.0 的主要原因。
现在我的项目具有一对多关系,我想将其转换为多对多。
这样的关系迁移可能吗?
当前代码:
public class File
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Key]
public int Id { get; set; }
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid UniqueId { get; set; }
public int RecordId { get; set; }
public virtual Record Record { get; set; }
// ...
}
public class Record
{
[Key]
public int Id { get; set; }
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid UniqueId { get; set; }
public virtual ICollection<File> Files { get; set; }
}
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public DbSet<File> Files { get; set; }
public DbSet<Record> Records { get; set; }
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
builder.Entity<Record>().ToTable("Record");
// for creating GUIDs
builder.Entity<Record>().Property(x => x.UniqueId).HasDefaultValueSql("newid()");
builder.Entity<File>().Property(x => x.UniqueId).HasDefaultValueSql("newid()");
}
}
在上面的代码中,您可以看到一条记录有零个、一个或多个文件。一个文件只有一个关联的记录。
我想更改此设置,以便可以将单个文件分配给多个记录(这样我可以减少重复文件并减少磁盘空间,通过增加缓存命中等来改善网络流量......)。
在文件类中,我是否只需删除这些代码行:
public int RecordId { get; set; }
public virtual Record Record { get; set; }
并用下面的这一行替换它?
public virtual ICollection<Record> Records { get; set; }
我不想破坏和手动更改数千个文件记录关系......或破坏它们。
解决方案
公共 int RecordId { 获取;放; } // 不要删除
公共虚拟记录记录{get; 放; }` 更改为
公共虚拟 ICollection 记录 { 获取;放; }
2.添加实体
public class FileRecord
{
public int FileId { get; set; }
public File File { get; set; }
public int RecordId { get; set; }
public Record Record { get; set; }
}
公共 DbSet FileRecords { 获取;放; }
entity.HasOne(d => d.Record)
.WithMany(p => p.Files)
.HasForeignKey(d => d.RecordId);
改成
entity.HasMany(d => d. Records)
.WithMany(p => p.Files)
.UsingEntity<FileRecord>(
j => j
.HasOne(pt => pt.Record)
.WithMany()
.HasForeignKey(pt => pt.RecordId),
j => j
.HasOne(pt => pt.File)
.WithMany()
.HasForeignKey(pt => pt.FileId),
j =>
{
j.HasKey(t => new { t.TeamId, t.RecordId });
});
5.添加迁移
In created migration file add
protected override void Up(MigrationBuilder migrationBuilder)
{
//……
migrationBuilder.Sql("INSERT INTO FileRecords (FileId, RecordId) SELECT Files.Id, Files.RecordId FROM Files");
}
public int RecordId { get; set; }
6.检查没问题,在File类中去掉,添加-迁移
推荐阅读
- django - 如何删除 django-extra-views 中的行?
- oauth - 当您拥有消费者密钥、秘密、令牌和令牌密钥时生成 oauth_Signature 的代码
- reactjs - 在 React Web 应用程序中定义联系我们表单的模型时如何包含 textarea 字段
- ansible - 如何将目录从远程机器复制到本地主机?
- javascript - 有没有办法修改数组中允许的值的标准?
- kubernetes - 如何为 istio 入口网关添加自定义端口?
- ssl - 需要从在线提供商处创建公钥基础设施的指导
- ios - 由于未捕获的异常“NSInvalidArgumentException”,我的 Xcode 应用程序在尝试实现 NSFetchedResultsController 后崩溃
- sql - 有条件地应用唯一索引
- kotlin - 使用 UTF-16LE 编码创建文件