#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();
}