Я хотел, чтобы объекты Mov ie, Actor, Director, User и c имели ровно одно изображение, а изображение принадлежало только одному объекту. Я определил и настроил их как -
Модели: (упрощенные)
public class Movie
{
public int Id { get; set; }
public string Title { get; set; }
public Image Image { get; set; }
}
public class Actor
{
public int Id { get; set; }
public string Name { get; set; }
public Image Image { get; set; }
}
// Director, User etc are defined in similar way
public class Image
{
public int Id { get; set; }
public string Base64 { get; set; }
public int? MovieId { get; set; }
public int? ActorId { get; set; }
public int? DirectorId { get; set; }
public int? UserId { get; set; }
}
Конфигурации: (упрощенные)
public class MovieConfig : IEntityTypeConfiguration<Movie>
{
public void Configure(EntityTypeBuilder<Movie> builder)
{
builder.ToTable("Movie");
builder.HasKey(p => p.Id);
builder.Property(p => p.Title).IsRequired(true).HasColumnType("nvarchar(128)");
builder.HasOne(e => e.Image)
.WithOne()
.HasForeignKey<Image>(e => e.MovieId)
.OnDelete(DeleteBehavior.Cascade);
}
}
// Actors, Director, User etc are configured in similar way
public class ImageConfig : IEntityTypeConfiguration<Image>
{
public void Configure(EntityTypeBuilder<Image> builder)
{
builder.ToTable("Image");
builder.HasKey(p => p.Id);
builder.Property(p => p.Base64).IsRequired(true).HasColumnType("nvarchar(MAX)");
}
}
Это генерирует схему с таблицей изображений, имеющей взаимно однозначные отношения с каждой таблицей Mov ie, Actor, Director, User и c, как и ожидалось.
Что меня беспокоит, так это все те nullable
поля внешнего ключа в Image, потому что -
- новый внешний ключ
nullable
должен быть добавлен всякий раз, когда новый объект с Image вводится - для любого изображения запись только для одного из этих столбцов внешнего ключа будет иметь значение
Какие еще способы я мог бы определить и настроить сущности для достижения того же результата, избегая этих nullable
внешних ключей?
Изменить: Или, в общем, считается нормальным иметь схему, подобную той, что у меня есть сейчас (с несколькими nullable
внешними ключами, где только один из них может иметь значение)?
Я не имеют большой опыт в проектировании / схемах баз данных и передовых / общих методах. Мне это казалось неправильным, и вот откуда возник вопрос.
Итак, не стесняйтесь высказать свое мнение и предложение?