Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.56/18: Рейтинг темы: голосов - 18, средняя оценка - 4.56
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
MS SQL

База данных для решения Картотека

01.10.2020, 12:25. Показов 4309. Ответов 53

Студворк — интернет-сервис помощи студентам
В разделе WPF я создал тему для реализации работы "Картотеки"

Картотека MVVM

В этой же теме я хочу создать базу данных с использованием EntityFramework и MSSQL.

Информацию, периодически, буду обновлять на GitHub:

https://github.com/limeniye/PatientArchive
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.10.2020, 12:25
Ответы с готовыми решениями:

База данных в программе: какие пути решения?
Приветствую! Подскажите как оптимальнее решить поставленную задачу? Задача: Необходимо создать приложение "Менеджер...

База картотека абонентов атс
Здравствуйте, я хотела проконсультироваться -как вы думаете,сколько таблиц лучше создать 3 или 2 и правильно ли я отразила суть задания в...

Разработка базы данных «Картотека закупок».
1.Тема « Разработка базы данных «Картотека закупок» 3. Задание: Разработать и протестировать базу данных, выполняющую хранение...

53
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
02.10.2020, 15:20
Студворк — интернет-сервис помощи студентам

Не по теме:

Цитата Сообщение от Usaga Посмотреть сообщение
Короче, куда ни плюнь, везде минусы свои найдутся
Ну это, да :)
Знаете, есть один универсальный способ без минусов - ничего не делать вообще !



Добавлено через 36 минут
Цитата Сообщение от Usaga Посмотреть сообщение
А значит нужны и репозитории)
А зачем ?

Добавлено через 2 минуты
Чем отличается строчка вызова метода репозитория от строчки вызова метода контекста Модели (SP) ?
Ну, кроме, конечно, компактно передаваемых параметров
0
Эксперт .NET
 Аватар для Usaga
14583 / 9489 / 1361
Регистрация: 21.01.2016
Сообщений: 35,787
02.10.2020, 15:53
Цитата Сообщение от MsGuns Посмотреть сообщение
А зачем ?
В случае работы с хранимыми процедурами - чтобы скрыть все те же вещи, что пришлось бы скрывать в случае, если бы SQL-запросы в коде прописывались. В сущности, что работа с SQL-запросами, что с хранимками - это всё низкоуровневая возьня с СУБД, которой не место на уровне бизнес-логики или представления, откуда это дело дёргается.

Цитата Сообщение от MsGuns Посмотреть сообщение
Чем отличается строчка вызова метода репозитория от строчки вызова метода контекста Модели (SP) ?
Ну, если у вас хранимки дёргает ORM, то репозитории и не нужны. Но и необходимость полновесной ORM тут тоже становится под вопросом. Зачем в проекте нужно средство генерации моделей по хранимкам (мастер), которое работает только в Visual Studio и неизвестно, будет ли в последующих версиях, когда мы можем тот же объём более простого и поддерживаемого кода (в сравнении с EDMX) написать руками, с применением Dapper, в чём угодно (Resharper, VS Code, блокнот)?
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
02.10.2020, 17:09
Цитата Сообщение от Usaga Посмотреть сообщение
Ну, если у вас хранимки дёргает ORM
Да, конечно.
Цитата Сообщение от Usaga Посмотреть сообщение
то репозитории и не нужны
Не нужны. О чем я и писал.

Вот свежий пример. Участвовал в проекте со страницей, где нужна была пагинация ибо данных было ну очень много - десятки тысяч строк. Сделал ее в репозитории - сетка листалась по нескольку секунд. Переделал на SP с выборкой нужного номера листа (а там всего пару десятков строк в листе), сетка стала листаться мгновенно. В первом случае - репозитрий, во втором - просто контекст Модели.

Цитата Сообщение от Usaga Посмотреть сообщение
В сущности, что работа с SQL-запросами, что с хранимками - это всё низкоуровневая возьня с СУБД, которой не место на уровне бизнес-логики или представления, откуда это дело дёргается.
Цитата Сообщение от Usaga Посмотреть сообщение
Но и необходимость полновесной ORM тут тоже становится под вопросом
А вот тут не согласен категорически.
Работа напрямую с SQL имеет ряд недостатков.
1. Громоздкий трудно читаемый код
2. Куча всяких ридеров, коммандов и коннектов
3. Возня с параметрами
4. Затруднительная отладка, т.к. приходится ловить запрос всякими бубнами и плясками чтобы увидеть собственно ошибку
5. Явные преобразования к типам Модели, что тоже загромождает код немало.
6. Наконец, надо просто знать этот самый SQL

Цитата Сообщение от Usaga Посмотреть сообщение
которое работает только в Visual Studio
Вот-вот, и я об том же. Если логика вложена в СУБД, то будет проект писаться в питоне, пехепе, жаве или в черте в ступе, - хранимки и функции будут работать одинаково - останется лишь соорудить простенькую ORM с примитивной рефлексией - и все замечательно будет бегать. Т.е. ОРМ нужна просто как "рычажки" и "кнопульки". Нажимай на них - и машинка поедет.
А какой собственно ORM: даппер, маппер и сраппер - по барабану

Добавлено через 18 минут
Вот почему я использую EF ?

Во-первых я работаю всегда Database First, т.к. мне проще, понятнее и привычнее мостить БД в каком-нибудь SQL-клиенте - ну знаю я SQL в нужном мне объеме. А не знаю чего-то, - у меня есть всезнающий гугль.
Намного проще и заливать в базу и данные из каких-нибудь экселей, текстовиков и даже дбф - не надо париться с трудно постижимой системой миграции, подстраиваться под ее "капризы".

Во-вторых, есть ТЗ на проект, есть требования к отображению данных. Из них легко определяется состав информации и ее источники. Пристегиваю EDM, выбираю нужные сущности из базы. Если чего-то не хватает - бегом на SQL Server и там по быстрячку сооружается нужная UDF/SP, после чего добавляется в модель.

Получаю (заметьте, безо всякого "кодинга") Модель, которая адекватно представляет нужную информацию БД.
Далее эту Модель я получаю к методе контроллера одной строкой из контекста Модели (или репозитория если он есть) и тут же сую ее в представление, протипизированное по соответствующему классу модели. В контроллере - это все.

В представлении пробегаюсь по датасету Модели или беру линейные данные из нее же и сую их в разметку.
Далее немного колдовства, никак не связанного ни с Моделью, ни вообще ни с каким ОРМ и даже БД, и страничка у меня оживает - сетки слушаются клавиш, все красится в нужный цвет, все подкачивается как надо. В общем - красота !

Добавлено через 8 минут
С внесением изменений та же история с географией.
Получаю в каком-нибудь HttpPost методе модель с заполненными юзером полями и просто перечисляю эти поля в параметрах вызываемого контекстного метода. Даже не заморачиваюсь с серверной валидацией - просто вызов метода обкладываю try и ловлю исключение, присланное самим SQL-сервером, которое и дублирую в окошке странички
3-4 строки кода - и все.
0
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
02.10.2020, 17:18  [ТС]
MsGuns, Usaga, тут у меня вопрос назрел.
Я хочу сделать всё code-first и у меня есть 4 Dto класса
Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
    public class GenderDto
    {
        public int Id { get;  }
        public string Name { get; }
    }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
    public class PatientDto
    {
        public int Id { get; }
        public string Surname { get; }
        public string Name { get; }
        public string Patronymic { get; }
 
        /// <summary>Объект класса Gender. Определяет пол пациента</summary>
        public GenderDto Gender { get; }
        public DateTime DateOfBirth { get; }
        public string ResidenceAddress { get; }
 
        /// <summary>Номер телефона имеет: код страны, код оператора, отальное число.</br>
        /// Если данные были указаны как-то неверно, тогда всё запишетcя только в "остальное число".
        /// </summary>
        public PhoneNumberDto PhoneNumber { get; }
 
        /// <summary>Объект содержит информацию посещений пациента.</summary>
        public PatientHistoryDto History { get; }
 
        #region Конструктор без передачи истории посещений
        /// <summary>Конструктор задающий все значения.</summary>
        /// <param name="id">Уникальный идентификатор.</param>
        /// <param name="surname">Фамилия пацаента.</param>
        /// <param name="name">Имя пацаента.</param>
        /// <param name="patronymic">Отчество пацаента.</param>
        /// <param name="gender">Пол пациента.</param>
        /// <param name="dateOfBirth">Дата рождения.</param>
        /// <param name="residenceAddress">Адрес проживания.</param>
        public PatientDto(int id, string surname, string name, string patronymic, GenderDto gender, DateTime dateOfBirth, string residenceAddress)
        {
            Id = id;
 
            //Иванов Иван Иванович
            Surname = surname;
            Name = name;
            Patronymic = patronymic;
 
            Gender = gender;
            DateOfBirth = dateOfBirth;
            ResidenceAddress = residenceAddress;
        }
        #endregion
 
        #region Конструктор с передачей истории посещений
        /// <summary>Конструктор задающий все значения.</summary>
        /// <param name="id">Уникальный идентификатор.</param>
        /// <param name="surname">Фамилия пацаента.</param>
        /// <param name="name">Имя пацаента.</param>
        /// <param name="patronymic">Отчество пацаента.</param>
        /// <param name="gender">Пол пациента.</param>
        /// <param name="dateOfBirth">Дата рождения.</param>
        /// <param name="residenceAddress">Адрес проживания.</param>
        /// <param name="history">Мед. карта поциента.</param>
        public PatientDto(int id, string surname, string name, string patronymic, GenderDto gender, DateTime dateOfBirth, string residenceAddress, PatientHistoryDto history)
        {
            Id = id;
 
            //Иванов Иван Иванович
            Surname = surname;
            Name = name;
            Patronymic = patronymic;
 
            Gender = gender;
            DateOfBirth = dateOfBirth;
            ResidenceAddress = residenceAddress;
 
            History = history;
        }
        #endregion
 
    }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    public class PatientHistoryDto
    {
        public int Id { get; }
 
        /// <summary>Дата определения диагноза</summary>
        public DateTime DateOfVisit { get; }
 
        /// <summary>Диагноз</summary>
        public string Diagnosis { get; }
 
        /// <summary>Конструктор задающий все значения.</summary>
        /// <param name="dateOfVisit">Дата посещения.</param>
        /// <param name="diagnosis">Диагноз.</param>
        public PatientHistoryDto(DateTime dateOfVisit, string diagnosis)
        {
            DateOfVisit = dateOfVisit;
            Diagnosis = diagnosis;
        }
    }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
    public class PhoneNumberDto
    {
        public int Id { get;  }
 
        /// <summary>Код страны без "+". Например Ukraine -- 38.</summary>
        public int CountryNumbers { get; }
 
        /// <summary>Оператор SIM-карты без "(...)". Например Kyivstar -- 068.</summary>
        public int OperatorNumbers { get; }
 
        /// <summary>Все числа, которые остаются после чисел оператора или некорректно указанный полный номер.</summary>
        public int RemainingNumbers { get; }
 
        /// <summary>Конструктор задающий все значения.</summary>
        /// <param name="id">Уникальный идентификатор.</param>
        /// <param name="countryNumbers">Код страны.</param>
        /// <param name="operatorNumbers">Числа оператора.</param>
        /// <param name="remainingNumbers">Оставшиеся числа, или полный номер.</param>
        public PhoneNumberDto(int id, int countryNumbers, int operatorNumbers, int remainingNumbers)
        {
            Id = id;
            CountryNumbers = countryNumbers;
            OperatorNumbers = operatorNumbers;
            RemainingNumbers = remainingNumbers;
        }
 
    }

Как я понимаю, мне нельзя их использовать для создания таблиц, потому что это не совсем те классы, которые нужны.
Как я себе это представляю? Мне кажется, должны быть отдельно Dto-классы и отдельно классы-сериализаторы, или как ещё это назвать.
Ну, что-то типо такого:
C#
1
2
3
4
5
class GenderSerializable
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }
C#
1
2
3
4
5
6
7
8
class PatientHistorySerializable
    {
        public int Id { get; set; }
 
        public DateTime DateOfVisit { get; set; }
 
        public string Diagnosis { get; set; }
    }
C#
1
2
3
4
5
6
7
class PhoneNumberSerializable
    {
        public int Id { get; set; }
        public int CountryNumbers { get; set; }
        public int OperatorNumbers { get; set; }
        public int RemainingNumbers { get; set; }
    }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class PatientSerializable
    {
        public int Id { get; set; }
        public string Surname { get; set; }
        public string Name { get; set; }
        public string Patronymic { get; set; }
 
        public virtual ICollection<GenderSerializable> Gender { get; set; }
 
 
        public DateTime DateOfBirth { get; set; }
        public string ResidenceAddress { get; set; }
 
        public virtual ICollection<PhoneNumberSerializable> PhoneNumber { get; set; }
 
        public virtual ICollection<PatientHistorySerializable> History { get; set; }
    }
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
02.10.2020, 18:43
Ух, наворотил !

Gender - это пол ? М/Ж ? Зачем для этого класс, а тем более таблица ?

History - это записи посещений с диагнозами, манипуляциями, назначенными лечениями и т.д. Ну типа карточки пациента ?

Patient - это собственно больной ?

Если очень упрощенно, т.е. без уточнений типа справочник болезней, справочник лекарственных препаратов и т.д. надо всего две таблицы:

1. Таблица пациентов: ФИО, пол (м/ж), адрес, контактный телефон
2. Таблица визитов: Дата, жалобы (все в строку), диагноз (все в строку), проведенные/назначенные лечебные процедуры (строка), назначенные препараты (таблетки) (строка)

Таблица визитов связана с таблицей пациентов отношением "много-к-одному".

Все. Какая тут "сериализация" - хз.

Добавлено через 12 минут
Code First - это метод для "продвинутых" разрабов, что бы там не писали в ненаучно-непопулярной литературе.
Для того, чтобы работать в этой манере, т.е. по сути вслепую, наощупь, надо иметь опыт и навыки.
И опять же хотя бы элементарные понятии о базовой теории СУБД.
У Вас, похоже, нет ни того, ни другого, ни третьего.

Пишущий Code First должен четко себе представлять, как интерпретируется на физической базе каждая строка его классов-таблиц. Чтобы потом не получилось "Сделал хотел утюг, слон получился вдруг" (с)

Если непременно хочется освоить эту технику, то вот совет - начните с Model First, где в режиме конструктора будет возможность визуально построить сущности и соорудить связи между ними. Потом посмотреть на сгенерированный автоматически код. Внимательно его проанализировать и понять.
И так раз 10. На разных базах.
И только усвоив как код классов и методов "ложится" на БД SQL-сервера, в какие сущности бизнес-логики он "превращается", пытаться перейти на "голое" программирование. Т.е. Code First

Если у Вас EF Core (насколько мне известно, в коре только Code First), не поленитесь создать тестовый проект с EF более ранней версии. А научившись, вернетесь опять к коре.
0
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
02.10.2020, 19:08  [ТС]
MsGuns, хорошо, если Gender не таблица, то как мне котролировать пол? Явно же не string использовать.
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
02.10.2020, 19:25
Цитата Сообщение от limeniye Посмотреть сообщение
MsGuns, хорошо, если Gender не таблица, то как мне котролировать пол
Вариантов масса - от bool до string ("м" и "ж")
Главное - это разделять их.
В базе можно определить как int, а в интерфейсе либо чекбоксом либо радио либо комбобоксом с двумя значениями (М и Ж)
При записи в БД подеменять М на 1, Ж - на 0.

Кстати, а чем string не угодил-то ? Вполне себе вариант.
0
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
02.10.2020, 19:30  [ТС]
MsGuns, хм, хорошо. Попробую сделать.
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
02.10.2020, 19:49
При проектировании БД и анализе предметной области важно сразу правильно квалифицировать объекты на "сущности" и "атрибуты".

Например, объект является "сущностью", т.к. он содержит "атрибуты".
Каждый "студент" имеет атрибуты "Фамилия", "Имя", "Отчество", "Пол", "Принадлежность к группе", "Контактный телефон", "Адрес". При этом очевидно, что лишь один из атрибутов не просто атрибут, а ссылается на другую "сущность" - группу.
Все же остальные являются "простыми" атрибутами. "Пол" тоже относится к "простым" поскольку не может принимать более двух конкретных значений.

Теперь добавим к студенту еще один свойство - атрибут "Характер". А вот тут заминка. Хоть объект "Характер" и является атрибутом, но сам по себе может быть "сущностью". Которая к тому же может динамически меняться сама по себе.
Поясню: известны например характеры "сангвиник", "холерик", "меланхолик" и т.д. Но надо вдруг добавить к этому списку новый характер. Допустим, "перманентный лодырь". Т.е. сам характер существует как бы сам по себе. Вполне может оказаться, что среди всех студентов нет ни одного "лодыря". Но сущность от этого не становится лишней и ее надо бы добавить в БД.
Вот для такого случая и добавляется в БД таблица-сущность для хранения всех возможных характеров.
А в соответствующем атрибуте сущности "Студент" место самого определения характера займет ссылка на Справочник Характеров.
При выборке списка студентов в запросе будет вместо ссылочного Id будет стоять наименование характера, которая извлечется из связанной join таблицей "Справочник характеров".

Когда будет писаться редактирование, то вместо TextBox напротив атрибута "Характер" нарисуется ComboBox со всеми вариантами, взятыми из таблицы-справочника "Характеры". А после выбора нужного в таблицу студентов будет помещен id выбранного характера.
1
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,236
02.10.2020, 21:58
Ну при CodeFirst очень удобно зашивать простые данные справочников в отдельные таблицы.
Типа того:
C#
1
2
3
4
5
6
public enum GenderEnum {
  [Description("Мужской")]
  Female,
  [Description("Женский"]
  Male
}
И сидировать захардкоженные из enum-ов значения в эти таблицы-справочники.
А в таблице пациента FK на справочник.
Чистая и понятная модель данных, а не эти туалетные "М" и "Ж".

Добавлено через 1 минуту
И бонусом - никогда не надо будет лазить в базу, чтобы получить PK значения из базы, так как значение справочника уже зашито в enum-е.
2
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
02.10.2020, 22:32  [ТС]
IamRain, вот, я это и хотел услышать. Спасибо!
0
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,236
02.10.2020, 22:42
limeniye, да пожалуйста.
PS: только description-ы надо поменять местами.
0
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
02.10.2020, 23:00  [ТС]
Хах, точно.
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
03.10.2020, 22:41
Цитата Сообщение от IamRain Посмотреть сообщение
Чистая и понятная модель данных, а не эти туалетные "М" и "Ж
Я Вас умоляю - кто будет видеть этот "туалет", юзеры ? Да ничего подобного ! Юзер будет видеть то, что подсовывает приложение - хоть значки Марса и Венеры
Использовать enum, конечно, можно. Для двух вариантов. Никогда не меняемых. И плюс целый класс в 6 строчек кода.
Глядя в ссылки на который случайно забредший в проект кодер будет гадать, а что же там за енум такой - может там есть и бесполые, и трехполые ?
Хотя, безусловно, у каждого свои вкусы.

Добавлено через 2 минуты
И, кстати, как Вы предполагаете хранить Ваш енум на сервере - просто интересненько ? Еще надцать строк кода для тудой-сюдой ?
0
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,236
04.10.2020, 10:22
Цитата Сообщение от MsGuns Посмотреть сообщение
И плюс целый класс в 6 строчек кода.
Ну и что? Зато модель данных корректна. Если вы любитель лазить в базу, всегда может зайти со стороны БД и увидеть, что там за справочники, а не собирать список уникальных значений из таблицы пациентов, пусть их там всего два.

Цитата Сообщение от MsGuns Посмотреть сообщение
Никогда не меняемых
Если не любитель - смотрите что там в enum-ах. Надо добавить доп.значения в справочник? - Добавляете в enum, сохраняя старый порядок, откатываете нужную миграцию, а потом снова ее же и накатываете.

Цитата Сообщение от MsGuns Посмотреть сообщение
И, кстати, как Вы предполагаете хранить Ваш енум на сервере - просто интересненько ? Еще надцать строк кода для тудой-сюдой ?
В таблице-справочнике, читайте внимательно.

Я не говорю, что у вас плохое решение, такое очень часто используется, есть и варианты где все справочники в одной таблице с полем-дисриминатором в одной таблице, как винегрет. И такое работает.

Я лишь хочу сказать, что в таком решении не очень хорошо "рюшечки разложены по полочкам"
1
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
04.10.2020, 13:42
Цитата Сообщение от IamRain Посмотреть сообщение
Если не любитель - смотрите что там в enum-ах.
В данном случае - их всегда только 2

Цитата Сообщение от IamRain Посмотреть сообщение
Я не говорю, что у вас плохое решение, такое очень часто используется, есть и варианты где все справочники в одной таблице с полем-дисриминатором в одной таблице, как винегрет. И такое работает.
Не надо домашнюю болонку сравнивать с псарней.

Цитата Сообщение от IamRain Посмотреть сообщение
Я лишь хочу сказать, что в таком решении не очень хорошо "рюшечки разложены по полочкам"
Если "рюшечки" - то да. А если "стежок" ?
0
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
05.10.2020, 07:40
Цитата Сообщение от IamRain Посмотреть сообщение
Надо добавить доп.значения в справочник? - Добавляете в enum, сохраняя старый порядок, откатываете нужную миграцию, а потом снова ее же и накатываете.
И это ради того, чтобы добавить еще один пол ? Почему так жестко-то ?
0
Эксперт .NET
 Аватар для Usaga
14583 / 9489 / 1361
Регистрация: 21.01.2016
Сообщений: 35,787
05.10.2020, 10:33
Цитата Сообщение от MsGuns Посмотреть сообщение
А вот тут не согласен категорически.
Работа напрямую с SQL имеет ряд недостатков.
Я имел в виду, что полновесная ORM не имеет смысла при работе с хранимыми процедурами. Достаточно даппера и всё.

Цитата Сообщение от MsGuns Посмотреть сообщение
Вот-вот, и я об том же. Если логика вложена в СУБД, то
Я не это имел в виду. Я имел в виду именно EDMX, которая только из студии формируется. Я понимаю, что лично вам это удобно. Но мы в команде отказались от этого подхода и используем code first. Причина проста: нет зависимости от некоего мастера в конкретной IDE, плюс мёржить сильно легче.

Добавлено через 6 минут
Цитата Сообщение от MsGuns Посмотреть сообщение
И, кстати, как Вы предполагаете хранить Ваш енум на сервере - просто интересненько ? Еще надцать строк кода для тудой-сюдой ?
Очень распространённый подход. Ещё, таблицу-справочник можно заменить на тупо ограничение CHECK. Но это если такой справочник в одном месте используется. И в базу за значением лезть не надо и целостность гарантируется. Все в плюсе.
0
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,236
05.10.2020, 14:32
Цитата Сообщение от Почтальон Посмотреть сообщение
И это ради того, чтобы добавить еще один пол ? Почему так жестко-то ?
Справочники - это редко меняющиеся данные, если все правильно делать и правильно думать.
Как вариант, можно найти в базе запись из __MigrationHistory и удалить ее. Затем снова запустить ef database update.
Автоматом добавятся новые значения.
Зато какой профит - чистая модель данных. И не надо лазить в БД от слова вообще никогда, если нужны значения справочника.
Типа того:
C#
1
2
3
4
5
6
7
8
9
var patient = new Patient  
{ 
Name = "Vasya", 
// это FK, navigation property  вообще не используется
// convention - если Id в начале имени, то это FK, очень удобно 
IdGender = (int)GenderEnum.Male
};
db.Patients.Add(patient);
db.SaveChanges();
Добавлено через 8 минут
И пусть в базе будет хоть 200 таблиц-справочников, в каждой из которых всего по 10 значений - ничего страшного, СУБД от этого не умрет. Все что нас интересует - это чистая модель данных и чистая объектная модель.
0
Эксперт .NET
 Аватар для Usaga
14583 / 9489 / 1361
Регистрация: 21.01.2016
Сообщений: 35,787
05.10.2020, 14:34
Цитата Сообщение от IamRain Посмотреть сообщение
IdGender = (int)GenderEnum.Male
На самом деле само свойство в модели смело можно делать перечислением и не парить с приведением типа. EF такое прожуёт совершенно нормально.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.10.2020, 14:34

База данных для телефонной станции ( С условием сортировки данных )
Здравствуйте! Нужно создать программку на Delphi &quot;База данных для телефонной станции ( С условием сортировки данных )&quot; Также большая...

База данных, основанная на службах vs База данных SQL Server
Доброго времени суток. Делал я, значит, Data Access Layer для ASP.NET MVC проекта. Создал обычную библиотеку классов, моделей туда...

Как правильно спроектировать база данных для Учет товаров для маленький фирмы
Привет всем.. Мне надо создать простую базу что пользователью было легко работать как в эксель но через сеть Из сети нашел Excel файл...

Готовая база данных для 8.2
Всем привет, ребят у кого есть заполненная база 1с предприятие 8.2, что бы были справочники, номенклатура, отчета и т.п. Любая тематика ...

База данных для теста
1) Как создать в базе данных тест ? 2) Как на форме выводить рандомные вопросы из теста?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302 Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru