• Стоит ли читать эту книгу?

    sarapinit
    @sarapinit Куратор тега C#
    На здоровье.
  • Специальности IT для экономиста?

    sarapinit
    @sarapinit
    Денис, ну если нет релевантного опыта, тогда куда угодно. А зачем вам именно в IT?
  • Специальности IT для экономиста?

    sarapinit
    @sarapinit
    За фразой "экономическое образование" может прятаться всё что угодно. Какой есть опыт, навыки, успешные проекты?
  • Как при помощи ASP запустить *.bat на сервере?

    sarapinit
    @sarapinit
    Надеюсь вы понимаете что это форма с готовой уязвимостью RCE и не собираетесь открывать эту форму в интернет
  • Как упростить переменную в C#?

    sarapinit
    @sarapinit Куратор тега C#
    #, да, наверное
  • Как упростить переменную в C#?

    sarapinit
    @sarapinit Куратор тега C#
    #, я решил что он последовательно дополняет переменную LocalData. Да это не одно и то же с массивом. Было бы не плохо увидеть корректный код в вопросе.
  • Какую схему хранения выбрать?

    sarapinit
    @sarapinit
    а есть ORM, которые это умеют в полной мере?

    не знаю таких, к сожалению
  • Какую схему хранения выбрать?

    sarapinit
    @sarapinit
    protracer, есть у меня некоторые убеждения против nosql хранения в начале проекта, подкрепленные личным опытом. Кажется что json хорошо подходит для раннего прототипирования, можно не думать о консистентности, но по факту это вылезает в нарушение корректности работы системы. Потому что если правила не вводить то и система будет работать как угодно. Если разработчиков на проекте больше чем 1, то лучше фиксировать логику в схеме и типах, я считаю.
    С другой стороны есть и оправданные кейсы для использования json, например сохранение нескольких наследников в одну таблицу. Когда общая часть хранится обычными полями а вариативная в json.

    Во-вторых, как я понимаю у вашей ORM нет поддержки jsonb, значит любой запрос будет выгружать целиком строку. Если частота запроса небольшая то может это и не имеет значения. Если будет рост нагрузки это может стать узким местом. С другой стороны можно даже через ORM написать более-менее быстрый запрос просто выгружая лишь ту часть данных, которая нужна.
  • Какую схему хранения выбрать?

    sarapinit
    @sarapinit
    Зачем jsonb? Какие запросы будут выполняться чаще всего. Сколько аккаунтов будет? и.т.д. Но главное, зачем jsonb?
  • Что такое нормализация базы данных простыми словами?

    sarapinit
    @sarapinit
    Oleg, нужно будет сделать в соответствии с вашими целями. Нормализация - инструмент.
    Например, вы делаете сайт в котором пользователь будет добавлять объявление о продаже машины на сайт.
    Важно ли для вас чтобы в системе были точно фиксированные цвета машин? Если важно то, забиваете все цвета в отдельную таблицу, объявления в другую, вешаете вторичный ключ. На форме простая выпадашка с цветами - при сохранении вставка идет в одну таблицу.
    Или вы хотите чтобы пользователь мог добавлять цвета и консистентность тоже хотите. Тогда делаете отдельную форму добавления цветов (и тогда для вас есть отдельный котёл в аду) или ставите на форму объявления более сложный контрол где можно и цвет выбрать и добавить. Тут у вас уже 2 вставки в базу: вставить новый цвет, вставить объявление.
    Или другая ситуация, приходит
    Начальник (Н) и говорит: у нас 100500К пользователей, медленно создается объявление
    Ты спрашиваешь (Т): а важно чтобы можно было свой цвет вставить?"
    Н: да, важно, они такие прикольные цвета создают, только форма из-за этого долго грузится, и список цветов долго листать.
    Тут вы закатываете рукава, на форме меняете выпадашку на текстбокс, переносите цвет текстом в таблицу с объявлениями а таблицу с цветами удаляете.

    Еще раз, нормализация инструмент. Сначала цель - потом инструмент.

    К сожалению цель не всегда очевидна, а в начале карьеры вообще непонятно как использовать инструменты. Поэтому у вас либо есть наставник, который укажет на ошибки, либо сделаете как получится а потом с горящей задницей будете быстро переделывать, когда система встанет.
  • Публикация dot.net проектов?

    sarapinit
    @sarapinit
    NewDevLab, ок. Но ты всё же потрать часок на TeamCity. Возможно это то что тебе подойдёт. Он бесплатный. По крайней мере, описание на главной странице выглядит релевантным.
  • Публикация dot.net проектов?

    sarapinit
    @sarapinit
    NewDevLab, Там есть общий пул виртуалок из которой вы можете использовать только одну одновременно и иногда приходится немного подождать если все заняты. Если вы подключаете свои машины, то просто пользуетесь. Но тоже есть ограничение на 1 конвейер за раз.
    Насколько я знаю есть версия для внутренней сети (раньше она называлась Team Foundation Server) но я ее не пробовал устанавливать.
    Я не очень понял что вы имеете ввиду под "не использовать сторонние сервисы", вы же уже ищете стороннее решение.
    Может ваш хостинг поддерживает stage и swap функциональность? В Azure WebSites например можно публиковаться в stage-слоты, а потом менять местами stage и production. В этом случае не нужен никакой конвейер. Просто кнопка Publish в VisualStudio.
    С другой стороны версионность можно обеспечить через официальную библиотеку и не нужно добавлять папки.
  • NULL в полях БД, а нужно?

    sarapinit
    @sarapinit
    А можно увидеть саму статью?
  • Как я могу конвертировать вложенный объект в Automapper?

    sarapinit
    @sarapinit Куратор тега C#
    Saharman, я понял. Действительно статус связывает обе сущности. Универсальное решение есть и оно выглядит примерно так
    Модели
    public class Room
        {
            public Guid Id { get; set; }
    
            public List<RoomUser> RoomUsers { get; set; }
        }
    
        public class User
        {
            public Guid Id { get; set; }
    
            public List<RoomUser> UserRooms { get; set; }
        }
    
        public class RoomUser
        {
            public Guid RoomId { get; set; }
    
            public Guid UserId { get; set; }
    
            public Room Room { get; set; }
    
            public User User { get; set; }
    
            public string Status { get; set; }
        }
    
        public class RoomDto
        {
            public Guid Id { get; set; }
    
            public string Status { get; set; }
    
            public List<UserDto> Users { get; set; }
        }
    
        public class UserDto
        {
            public Guid Id { get; set; }
    
            public string Status { get; set; }
    
            public List<RoomDto> Rooms { get; set; }
        }

    Конфигурация маппера
    var config = new MapperConfiguration(cfg =>
                {
                    cfg.CreateMap<Room, RoomDto>()
                        .ForMember(o => o.Users, exp => exp.MapFrom(m => m.RoomUsers));
                    cfg.CreateMap<User, UserDto>()
                        .ForMember(o => o.Rooms, exp => exp.MapFrom(m => m.UserRooms));
    
                    cfg.CreateMap<RoomUser, UserDto>()
                        .ForMember(o => o.Id, exp => exp.MapFrom(m => m.User.Id));
                        //.IncludeMembers(o => o.User);
                    cfg.CreateMap<RoomUser, RoomDto>()
                        .ForMember(o => o.Id, exp => exp.MapFrom(m => m.Room.Id));
                        //.IncludeMembers(o => o.Room);
                });


    Проверка:
    var mapper = config.CreateMapper();
    
    
                var room = new Room
                {
                    Id = Guid.NewGuid(),
                    RoomUsers = new List<RoomUser>()
                };
                var user = new User
                {
                    Id = Guid.NewGuid(),
                    UserRooms = new List<RoomUser>()
                };
    
                var link = new RoomUser
                {
                    User = user,
                    Room = room,
                    RoomId = room.Id,
                    UserId = user.Id,
                    Status = "admin"
                };
                room.RoomUsers.Add(link);
                user.UserRooms.Add(link);
    
                var byRoom = mapper.Map<RoomDto>(room);
                Console.WriteLine(JsonConvert.SerializeObject(byRoom, Formatting.Indented));
    
                var byUser = mapper.Map<UserDto>(user);
                Console.WriteLine(JsonConvert.SerializeObject(byUser, Formatting.Indented));


    Минусом такого решения являются дополнительные поля, которые не имеют значений после сериализации. Это происходит потому что используются универсальные модели.
    Тут есть несколько вариантов:
    - выразительность не важна и тогда можно забить на левые поля в json
    - сделать отдельные Dto для каждого варианта только с теми полями которые нужны
    - отказаться от маппера и написать преобразование в контроллере с использование анонимных типов и в них указывать только то что нужно
  • Как я могу конвертировать вложенный объект в Automapper?

    sarapinit
    @sarapinit Куратор тега C#
    Saharman, я отвечу так. Вложенные модели можно маппить с помощью IncludeMembers
    Но мне кажется что в вашем случае преобразование будет некорректно, потому что есть ссылки друг на друга в Dto и поле Status относится к 2м моделям сразу. Если бы вы привели пример из реального мира это могло бы стать очевидным.
  • Как я могу конвертировать вложенный объект в Automapper?

    sarapinit
    @sarapinit Куратор тега C#
    У вас поле Status есть и в ADto и в BDto, это опечатка?