EF Core - проверка до update/insert

228
28 июля 2021, 12:40

Пишу приложение которые часто (и много) перебирает данных с xlsx таблиц поставщиков.

Мое приложение имеет следующие классы: Артикулы ценовой группы:

using System;
using System.Collections.Generic;
namespace Parser.Models
{
    public class Article
    {
        public int Id { get; set; }
        public string Value { get; set; }
        public int? GroupId { get; set; }
        public Group Group { get; set; }
    }
}

Конкуренты (с их наименованием и ценой):

using System;
using System.Collections.Generic;
namespace Parser.Models
{
    public class Competitor
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public decimal Price { get; set; }
        public int? GroupId { get; set; }
        public Group Group { get; set; }
    }
}

Непосредственно сама группа:

using System;
using System.Collections;
using System.Collections.Generic;
namespace Parser.Models
{
    public class Group
    {
        public int Id { get; set; }
        public string SubGroup { get; set; }
        public string Category { get; set; }
        public string Brand { get; set; }
        public string Model { get; set; }
        public decimal FinalPrice { get; set; }
        public decimal ExtraCharge { get; set; }
        public decimal MarginMin { get; set; }
        public decimal MarginAvg { get; set; }
        public decimal MarginMax { get; set; }
        public decimal EntryPrice { get; set; }
        public decimal Price { get; set; }
        public decimal MinPrice { get; set; }
        public decimal AvgPrice { get; set; }
        public decimal MaxPrice { get; set; }
        public ICollection<Competitor> Competitors { get; set; }
        public ICollection<Article> Articles { get; set; }
        public Group()
        {
            Competitors = new List<Competitor>();
            Articles = new List<Article>();
        }
    }
}

Главный класс приложения выглядит так:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using Microsoft.EntityFrameworkCore;
using OfficeOpenXml;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Database;
using Parser.Models;
namespace Parser
{
    static class Program
    {
        private static decimal Parse(string s)
        {
            if (string.IsNullOrEmpty(s))
            {
                return 0;
            }
            s = s.Replace(",", CultureInfo.InvariantCulture.NumberFormat.NumberDecimalSeparator);
            return decimal.Parse(s, NumberStyles.Any,
                CultureInfo.InvariantCulture);
        }
        static void Main(string[] args)
        {
            var file = new FileInfo("zoomos.xlsx");
            using (var db = new Context())
            using (ExcelPackage package = new ExcelPackage(file))
            {
                var worksheet = package.Workbook.Worksheets[1];
                int colCount = worksheet.Dimension.End.Column; //get column Count
                int rowCount = worksheet.Dimension.End.Row; //get row count
                for (int i = 2; i <= rowCount; i++)
                {
                    var competitors = new List<Competitor>();
                    var group = new Group
                    {
                        SubGroup = worksheet?.Cells[i, 2]?.Value?.ToString(),
                        Category = worksheet?.Cells[i, 3]?.Value?.ToString(),
                        Brand = worksheet?.Cells[i, 4]?.Value?.ToString() ?? "null",
                        Model = worksheet?.Cells[i, 5]?.Value?.ToString(),
                        FinalPrice = Parse(worksheet?.Cells[i, 6]?.Value?.ToString() ?? "0.0"),
                        ExtraCharge = Parse(worksheet?.Cells[i, 7]?.Value?.ToString() ?? "0.0"),
                        MarginMin = Parse(worksheet?.Cells[i, 8]?.Value?.ToString() ?? "0.0"),
                        MarginAvg = Parse(worksheet?.Cells[i, 9]?.Value?.ToString() ?? "0.0"),
                        MarginMax = Parse(worksheet?.Cells[i, 10]?.Value?.ToString() ?? "0.0"),
                        EntryPrice = Parse(worksheet?.Cells[i, 11]?.Value?.ToString() ?? "0.0"),
                        Price = Parse(worksheet?.Cells[i, 12]?.Value?.ToString() ?? "0.0"),
                        MinPrice = Parse(worksheet?.Cells[i, 15]?.Value?.ToString() ?? "0.0"),
                        AvgPrice = Parse(worksheet?.Cells[i, 17]?.Value?.ToString() ?? "0.0"),
                        MaxPrice = Parse(worksheet?.Cells[i, 18]?.Value?.ToString() ?? "0.0"),
                    };
                    var article = new Article
                    {
                        Value = worksheet?.Cells[i, 1]?.Value?.ToString(),
                        Group = group
                    };
                    for (int j = 19; j <= colCount; j++)
                    {
                        competitors.Add(new Competitor
                        {
                            Name = worksheet?.Cells[1, j].Value.ToString() ?? "No Name",
                            Price = Parse(worksheet?.Cells[i, j]?.Value?.ToString() ?? "0"),
                            Group = group
                        });
                    }
                    db.Groups.Add(group);
                    db.Articles.Add(article);
                    db.Competitors.AddRange(competitors);
                    db.SaveChanges();
                }
            }
        }
    }
}

Как можно до методов

db.Groups.Add(group);
db.Articles.Add(article);
db.Competitors.AddRange(competitors);
db.SaveChanges();

Сделать какую-либо проверку полей связных таблиц?

READ ALSO
Работа с классом из другого скрипта

Работа с классом из другого скрипта

Всем привет, имею класс

197
Не могу зайти в аккаунт Visual Studio

Не могу зайти в аккаунт Visual Studio

Возникла такая проблема при входе в аккаунт в visual studio окно для ввода данных просто завислоМожет кто-то сталкивался с такой проблемой

205
Как связать два компьютера и обменяться между ними байтами используя Tcp?

Как связать два компьютера и обменяться между ними байтами используя Tcp?

Как используя Tcp протокол обменяться данными с другим компьютером по типу server-client и что для этого нужно, все что находил работает только в локальной...

334
При создании пула как работает параметр connectionLimit?

При создании пула как работает параметр connectionLimit?

connectionLimit при создании пула соединений с mysql выставляет ограничения для конкретного пользователя? Те если я выставлю это значение на 2 то только...

353