Как добавить уникальные ключевые ограничения на комбинацию двух столбцов, используя .NET CORE 3.1 code first approch?

#entity-framework-core #unique-constraint

#entity-framework-core #уникальное ограничение

Вопрос:

Я использую версию .NET CORE 3.1 и подход code first для создания базы данных. Моя модель на c# :

 [Table("ProfileStore")]
public class ProfileStore : BaseEntity
{
    [ForeignKey("Profile")]
    public int ProfileId { get; set; }

    [ForeignKey("Store")]
    public int StoreId { get; set; }

    public virtual Stores.Store Store { get; set; }

    public virtual Profile Profile { get; set; }
}
 

Здесь Profile и Store — это разные таблицы, и я добавляю сопоставление этих двух таблиц в эту таблицу. Теперь я хочу добавить строку только с уникальной комбинацией. Как я могу это сделать?

Примерные данные будут :

 Id    ProfileId   StoreId
1        1           1
2        1           2
3        2           1
4        2           3
5        1           1    <------- This is should not insert when I will try to insert this.
 

Ответ №1:

Используйте настройку отношений «многие ко многим» в Entity Framework Core. Сначала добавьте ICollection каждую сущность в другую.

 
    public class Profile
    {
        // other property
        public ICollection<Store> Stores { get; set; }
    }  
    
    public class Store
    {
        // other property
        public ICollection<Profile> Profiles { get; set; }
    }

 

затем используйте FluentAPI и настройте таблицу соединений следующим образом:

 
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<ProfileStore>()
            .HasKey(ps => new { ps.ProfileId, bc.StoreId }).IsUnique();  
        modelBuilder.Entity<ProfileStore>()
            .HasOne(ps => ps.Profile)
            .WithMany(p => p.ProfileStore)
            .HasForeignKey(ps => ps.ProfileId);  
        modelBuilder.Entity<ProfileStore>()
            .HasOne(ps => ps.Store)
            .WithMany(s => s.ProfileStore)
            .HasForeignKey(ps => ps.StoreId);
    }

 

Комментарии:

1. Я пробовал это, но не работает. Нужно добавить миграцию после добавления этих свойств?

2. лучше откатить предыдущую миграцию и повторить попытку с этой конфигурацией, возможно, сработает

Ответ №2:

Я попробовал приведенный ниже код, и он работает. Не забудьте добавить миграцию после этого изменения кода.

     protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<ProfileStore>()
            .HasIndex(p => new { p.ProfileId, p.StoreId }).IsUnique();
    }