У меня есть проект 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()");
}
}
В приведенном выше коде вы можете видеть, что запись имеет ноль, один или несколько файлов. С файлом связана только одна запись.
Я хотел бы изменить это так, чтобы один файл мог быть назначен нескольким записям (таким образом я уменьшаю количество дубликатов файлов и уменьшаю дисковое пространство, улучшаю сетевой трафик за счет увеличения количества обращений к кешу и т. д.).
В классе File я просто удаляю эти строки кода:
public int RecordId { get; set; }
public virtual Record Record { get; set; }
и заменить его этой строкой ниже?
public virtual ICollection<Record> Records { get; set; }
Я бы не хотел уничтожать и вручную изменять многие тысячи взаимосвязей файловых записей... или нарушать их.