Наличие внешних ключей, допускающих значение NULL, во взаимно-однозначных отношениях с более чем одной сущностью - PullRequest
1 голос
/ 05 августа 2020

Я хотел, чтобы объекты 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, потому что -

  1. новый внешний ключ nullable должен быть добавлен всякий раз, когда новый объект с Image вводится
  2. для любого изображения запись только для одного из этих столбцов внешнего ключа будет иметь значение

Какие еще способы я мог бы определить и настроить сущности для достижения того же результата, избегая этих nullable внешних ключей?

Изменить: Или, в общем, считается нормальным иметь схему, подобную той, что у меня есть сейчас (с несколькими nullable внешними ключами, где только один из них может иметь значение)?

Я не имеют большой опыт в проектировании / схемах баз данных и передовых / общих методах. Мне это казалось неправильным, и вот откуда возник вопрос.

Итак, не стесняйтесь высказать свое мнение и предложение?

1 Ответ

0 голосов
/ 05 августа 2020

Создайте отношения для MovieId, ActorId, DirectorId и UserId в таблице изображений на сервере sql.

Затем повторно обновите свой dbcontext, и эти внешние идентификаторы будут автоматически сохранены из mov ie, субъект, директор и пользователь при вставке.

...