EFCore, как убрать ограничение на уникальность объекта в столбце таблицы

Рейтинг: 0Ответов: 1Опубликовано: 09.03.2023

У меня есть три таблицы, я хочу их заполнить тестовыми данными. Сами таблицы:

    public class Service : NamedEntity
    {
        public ListOfServices ListOfServices { get; set; }
       
        [Column(TypeName = "decimal(18,2)")]
        public decimal Price { get; set; }
    }

    public class Order : Entity
    {
        [Column(TypeName = "decimal(18,2)")]
        public decimal Price { get; set; }

        public DateTime OrderDate { get; set; }

        public virtual Client Client { get; set; }

        public virtual Employee Employee { get; set; }

        public string ObjectOfWork { get; set; }

        public virtual ListOfServices ListOfServices { get; set; }

        public string Status { get; set; }

        public string? Description { get; set; }
    }

    public class ListOfServices : Entity
    {
        public long ServiceId { get; set; }
        public Service Services { get; set; }
        
        public long OrderId { get; set; }
        public Order Order { get; set; }
    }

Код заполнения таблиц:

        private const int __ServicesCount = 30;
        private Service[] _Services;
        private async Task InitializeServices()
        {
            var rnd = new Random();
            _Services = Enumerable.Range(1, __ServicesCount)
                .Select(i => new Service
                {
                    Name = $"Название услуги {i + 1}",
                    Price = (decimal)rnd.NextDouble() * 2000 + 700
                })
                .ToArray();
            await _db.Services.AddRangeAsync(_Services);
            await _db.SaveChangesAsync();
        }



        private const int __OrdersCount = 5;
        private Order[] _Orders;
        private async Task InitializeOrders()
        {
            var rnd = new Random();
            _Orders = Enumerable.Range(1, __OrdersCount)
                .Select(i => new Order
                {
                    OrderDate = DateTime.UtcNow,
                    Employee = rnd.NextItem(_Employees),
                    Client = rnd.NextItem(_Clients),
                    ObjectOfWork = $"ГБЦ {i}",
                    Price = (decimal)rnd.NextDouble() * 4000 + 700,
                    Status = "Неизвестно",
                    Description = ""
                })
                .ToArray();
            await _db.Orders.AddRangeAsync(_Orders);
            await _db.SaveChangesAsync();
        }

        private const int __ListOfServicesCount = 50;
        private ListOfServices[] _ListOfServices;
        private async Task InitializeListOfServices()
        {
            var rnd = new Random();

            _ListOfServices = Enumerable.Range(1, __ListOfServicesCount)
                .Select(i => new ListOfServices
                {
                    Services = rnd.NextItem(_Services),
                    Order = rnd.NextItem(_Orders)
                })
                .ToArray();
            await _db.ListOfServices.AddRangeAsync(_ListOfServices);
            await _db.SaveChangesAsync();
        }

Я ожидаю что таблица ListOfServices после инициализации данных будет иметь 50 строк, а генерируется максимум 5. При попытки добавить строку вручную со значением, которое уже было в таблице вылезает ошибка:введите сюда описание изображения

Таблица ListOfServices является связующей. Благодаря ей я хочу получить список предоставленных услуг в заказе

Ответы

▲ 1Принят

Проблему решил. Как оказалось нужно было всего-лишь прописать конфигурацию отношения многие-ко-многим. Код изменился следующим образом:

    public class ListOfServices : Entity
    {
        public long ServiceId { get; set; }
        public Service? Service { get; set; }

        public long OrderId { get; set; }
        public Order? Order { get; set; }
    }

    public class Service : NamedEntity
    {
        public ICollection<ListOfServices>? ListOfServices { get; set; }
        public ICollection<Order>? Order { get; set; }

        [Column(TypeName = "decimal(18,2)")]
        public decimal Price { get; set; }
    }

    public class Order : Entity
    {
        //Вместо public virtual ListOfServices ListOfServices { get; set; }
        //Было добавлено
        public ICollection<ListOfServices>? ListOfServices { get; set; }
        public ICollection<Service>? Services { get; set; }
    }

В контексте БД был переопределен метод создания модели:

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Order>()
                  .HasMany(c => c.Services)
                  .WithMany(s => s.Order)
                  .UsingEntity<ListOfServices>();
        }

В результате в таблице ListOfServices было заполнено 50 строк: введите сюда описание изображения