Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
1 / 1 / 0
Регистрация: 02.10.2012
Сообщений: 110
.NET Core

Как заполнить базу данных, миграция и т.д (EF)?

14.10.2022, 13:24. Показов 2739. Ответов 40
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
добрый день есть таблицы(сущности), основная ворд, которая ссылается на другие
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    public class Word
    {
 
        [Key]
        public int Id { get; set; }
        public WordEng WordEng { get; set; }
        public Translate WordRu { get; set; }
        public List<CheckWord> CheckWords { get; set; }
 
        private static int Count = 0;
 
        public Word(){ 
            //Id = ++Count; 
        }
}
хочется при самом первом создании заполнить ее, вродебы называется миграцией. Неважно, слова ображуются динамичсеки:
C#
1
CreateList createList = new CreateList();
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    public AplicationContext(DbContextOptions<AplicationContext> options):base(options)
    {
        Database.EnsureDeleted();///пока временно если что-то заполнит
        Database.EnsureCreated();
    }
 
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        CreateList createList = new CreateList();
        //modelBuilder.Entity<User>().HasData(new User { Id=1, Login="praj", Password="ifkjvs1",Email="prajdziswet@mail.ru"});
        if (createList != null && createList.Words.Count > 0)
        {
            foreach (Word word in createList.Words)
            {
                modelBuilder.Entity<Word>().HasData(word);
            }
        }
    }
при создании возникает две ошибки
1) Не заполнен Id
2) Если заполняю Id (через статическое поле), при добавлении самого слова Word выдает исключение, что CheckWord уже существует и не может добавить за него word.
Как заполнить при создании бд?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.10.2022, 13:24
Ответы с готовыми решениями:

Миграция в базу данных черех powershell
Здравствуйте. Хочу создать миграцию в базу данных, используя команду powershell: dotnet ef migrations add _initial. Но почему-то...

как заполнить базу данных
Здравствуйте Я установил mysql server, через workbench создал таблицы и связи между ними Как теперь работать с базой? Как открыть её на...

Как заполнить базу данных на Mac
Всем привет! Исходные данные Есть много файлов с таблицами. Эти таблицы нужно перенести в БД на SQLite. Работаю под маком, что...

40
1 / 1 / 0
Регистрация: 02.10.2012
Сообщений: 110
15.10.2022, 08:13  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Usaga Посмотреть сообщение
Ого) Подросло поколение разработчиков, которое уже схему базы руками не в состоянии создать?) А что делать, если миграции EF'а не могут создать нужную схему? Если мы знаем больше, чем умеет EF?
ничего там сложного нет ее руками создать, с миграцией тож, только если одно свойсва, скоректировать - проще ручками (миграция класная штука)
//сейчас вопрос: не с Миграцией; не о том, как ручками создать;не о том Вы умнее - я тупее и т.д

"Умник, у меня вопрос". - Вы всех принижаете, чтобы самому умнее показаться?!
Вы знаете как подправить OnmodelCreating?????
(Dr9vik хоть подсказвает, что можно, через сервисы скоректировать. Но хочется при создание модели таблицы заполнить - для это метод создание модели есть (OnmodelCreating)). => Буду Благодарен, за подсказки.

Добавлено через 13 минут
п.с спасибо, что с задачами (Task) подсказал
0
Эксперт .NET
 Аватар для Usaga
14367 / 9468 / 1360
Регистрация: 21.01.2016
Сообщений: 35,725
15.10.2022, 08:22
prajdziswet, собственно, вам выше верно заметили про то, что Id должен быть первичным ключом с IDENTITY. Тогда ваш код в первом после корректно отработает. И последующие вставки в таблицу не будут вызвать ошибок.

На данный момент вы руками эти ID генерируете, причём неправильно, не учитываете параллельную вставку в эту таблицу, когда у вас ID могут пересечься.
0
1 / 1 / 0
Регистрация: 02.10.2012
Сообщений: 110
15.10.2022, 09:37  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
На данный момент вы руками эти ID генерируете, причём неправильно, не учитываете параллельную вставку в эту таблицу, когда у вас ID могут пересечься.
я сразу убрал, если про "статику" (понимал, что это неправильный путь, задавать ключы)...

нужна подсказка, задал везде
C#
1
[Key]
(не только Word)
навсякий случай как выглядит OnModelCreating
C#
1
2
3
4
5
6
7
8
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        CreateList createList = new CreateList();
        if (createList != null && createList.Words.Count > 0)
        {
            modelBuilder.Entity<Word>().HasData(createList.Words.ToArray());
        }
    }
теперь возникает ошибка с конструктором
не совсем понимаю почему он не может связать свойства
так выглядит коснтуктор Word
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        public Word(WordEng wordEng,Translate translate=null, List<CheckWord> checkWords=null)
        {
            WordEng = wordEng;
 
            if (translate != null)
            {
                WordRu = translate;
                CheckWords=checkWords;
            }
            else
            {
                WriteInHtmlRu rus = new WriteInHtmlRu(wordEng.Word);
                WordRu = rus.Translate;
                CheckWords=rus.CheckWords;
            }
        }
задал пустой - отрицательное значение....

совершенно глупый вопрос как задать первичный ключ
0
Эксперт .NET
 Аватар для Usaga
14367 / 9468 / 1360
Регистрация: 21.01.2016
Сообщений: 35,725
15.10.2022, 09:46
Цитата Сообщение от prajdziswet Посмотреть сообщение
теперь возникает ошибка с конструктором
Так не надо убирать дефолтный конструктор. Как EF вам такую сущность-то создавать будет?

Цитата Сообщение от prajdziswet Посмотреть сообщение
совершенно глупый вопрос как задать первичный ключ
Атрибутом, как вы и сделали.
0
1 / 1 / 0
Регистрация: 02.10.2012
Сообщений: 110
15.10.2022, 09:51  [ТС]
точнее у меня атрибут если быть точным
C#
1
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
,хотя оно не влияет если и просто кеу

вываливается самая первая (правда точного определения первой ошибки непомню) , что нулевой ключ
0
Эксперт .NET
 Аватар для Usaga
14367 / 9468 / 1360
Регистрация: 21.01.2016
Сообщений: 35,725
15.10.2022, 09:54
prajdziswet, выдержка из документации:

Ограничения начальных данных модели
Этот тип начальных данных управляется миграциями, и скрипт для обновления данных, уже имеющихся в базе данных, необходимо создать без подключения к базе данных. Это накладывает некоторые ограничения:

Значение первичного ключа необходимо указать, даже если оно обычно создается базой данных. Он будет использоваться для обнаружения изменений данных между миграциями.
Ранее засеявшиеся данные будут удалены, если первичный ключ был изменен каким-либо образом.
Значит базу нужно будет дозаполнять не в методе OnModelCreating
0
1 / 1 / 0
Регистрация: 02.10.2012
Сообщений: 110
15.10.2022, 10:06  [ТС]
Ладно(задам в createList), тогда возвращаемся к пункту 2
у меня
C#
1
public List<CheckWord> CheckWords { get; set; }
под "капотом"(sql) оно то этому свойсву создаст id, но я же условно физически в коде вижу список, у меня нету id-a?

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

//чуть позже отпишусь, пока по делам
0
Эксперт .NET
 Аватар для Usaga
14367 / 9468 / 1360
Регистрация: 21.01.2016
Сообщений: 35,725
15.10.2022, 10:09
Я ничего не понял)
0
1 / 1 / 0
Регистрация: 02.10.2012
Сообщений: 110
15.10.2022, 10:17  [ТС]
согласен, трудно для восприятия пишу =)))
посмотри первичный вопрос:
"при создании возникает две ошибки
1) Не заполнен Id
2) Если заполняю Id (через статическое поле), при добавлении самого слова Word выдает исключение, что CheckWord уже существует и не может добавить за него word."

т.е пункт один я заполнял (может не правильно через приватное-статическое свойство), вываливалась вторая ошибка...

п.с потом покажу скрин второй ошибки - будет ясно... трудно объяснить..
и пока созданую раньше базу, как оно внутри себя представляет в скл... == будет понятнее
0
403 / 265 / 69
Регистрация: 12.04.2020
Сообщений: 1,404
15.10.2022, 12:39
Цитата Сообщение от Usaga Посмотреть сообщение
А что делать, если миграции EF'а не могут создать нужную схему?
например?
она не может повторить классы что в коде?
0
Эксперт .NET
 Аватар для Usaga
14367 / 9468 / 1360
Регистрация: 21.01.2016
Сообщений: 35,725
15.10.2022, 12:53
Dr9vik, она может повторить вычисляемые поля? Она может повторить триггеры? Она может повторить составные, покрывающие и условные индексы? Она может повторить не древесные индексы, типа GIST? Она может повторить представления (View)?

Добавлено через 12 минут
Я не сильно против механизма миграций в EF. Но глядя на его возможности и на проекты, над которыми я работаю, я вижу, что это или для прототипирования, или для студентов, на "поиграться".
0
403 / 265 / 69
Регистрация: 12.04.2020
Сообщений: 1,404
15.10.2022, 13:17
Лучший ответ Сообщение было отмечено prajdziswet как решение

Решение

Цитата Сообщение от Usaga Посмотреть сообщение
она может повторить
нет конечно
все что от нее требуется, сделать копию моделей в коде, она может
и все что вы перечислили коду начхать есть это или нету

Добавлено через 4 минуты
Цитата Сообщение от prajdziswet Посмотреть сообщение
трудно объяснить.
это работает и не мучайте голову
в OnModelCreating нельзя сделать то что вы хотите
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
using (var scope = host.Services.CreateScope())
            {
                    var services = scope.ServiceProvider;
                    var context = services.GetRequiredService<ApplicationDbContext>();
                    var elem = context.As;
                    A a1 = new A(){ Name = "1", Bs = new List<B>() { new B() { Name = "2" } } };
                    A a2 = new A(){ Name = "3"};
                    B b = new B() { Name = "4" };
                    context.Set<A>().Add(a1);
                    context.Set<A>().Add(a2);
                    context.SaveChanges();
                    b.AId = a2.Id;
                    context.Set<B>().Add(b);
                    context.SaveChanges();
                    var aa =  context.Set<A>().Include(x => x.Bs).ToList();
                }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    public class A
    {
        [Key]
        public int Id { get; set; }
        public string Name { get; set; }
        public IList<B> Bs { get; set; }
    }
    public class B
    {
        [Key]
        public int Id { get; set; }
        public int AId { get; set; }
        public A A { get; set; }
        public string Name { get; set; }
    }
1
Эксперт .NET
 Аватар для Usaga
14367 / 9468 / 1360
Регистрация: 21.01.2016
Сообщений: 35,725
15.10.2022, 13:21
Цитата Сообщение от Dr9vik Посмотреть сообщение
нет конечно
все что от нее требуется, сделать копию моделей в коде, она может
и все что вы перечислили коду начхать есть это или нету
Ну и в чём тогда вопрос?)
0
1 / 1 / 0
Регистрация: 02.10.2012
Сообщений: 110
15.10.2022, 14:34  [ТС]
Цитата Сообщение от Dr9vik Посмотреть сообщение
...
это работает и не мучайте голову
...
мне Dr9vik хочется по красивому (поэтому и мучаюсь), у меня создавала в контроллере (Home) - все работало. У тебя чуть-чуть по-лучше, но условно также (тоже самое, поэтому написал, что твой вариант скорее всего рабочий - ты же и потвердил) -> через сервис ->создаешь копию базы и вносишь, что нужно....

хочется в модели базы данных, при ее создании - хочется чтобы код заполнения лежал там где нужно, а не где-то еще.
Ладно у меня тут проект раз и обчелся, а если будет огромадный, эти строчки и не найдешь.
Спасибо оромное, счас попробую - может и Usaga, чуть подскажет.
нет у меня база заполнялась через контролер, мне базу просто достаточно скопировать на :С и будет заполнено (просто как то не могу поверить, что нельзя сделать через OnModelCreating [хотя я склоняюсь, что нельзя]
0
1 / 1 / 0
Регистрация: 02.10.2012
Сообщений: 110
15.10.2022, 15:21  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Ну и в чём тогда вопрос?)
решил для смеха это сообщение выбрать (хоть вы там миграцию обсуждали, а тут другое = )))

Короче, при задавании ключей переходим к п.2


хотел показать список как отображается, а он никак не отображается, что-то я напутал с Id списка или он очень далеко зарыт:
0
1 / 1 / 0
Регистрация: 02.10.2012
Сообщений: 110
15.10.2022, 15:26  [ТС]
Как я понимаю (может и не прав), он добавляет WordEng, WordRU, CheckWord..а потом пытается привязать CheckWord и натыкается что он типа установлен.
Хотя я сам не доконца понимаю данную ошибку
0
Эксперт .NET
 Аватар для Usaga
14367 / 9468 / 1360
Регистрация: 21.01.2016
Сообщений: 35,725
16.10.2022, 04:19
prajdziswet, вообще, если по-хорошему, заполнять базу должно не ваше приложение. По крайней мере, в реальной разработке именно так.
0
1 / 1 / 0
Регистрация: 02.10.2012
Сообщений: 110
16.10.2022, 06:05  [ТС]
- это больше для себя - слова подучить англ..
0
1 / 1 / 0
Регистрация: 02.10.2012
Сообщений: 110
18.10.2022, 15:25  [ТС]
Цитата Сообщение от Dr9vik Посмотреть сообщение
это работает и не мучайте голову
в OnModelCreating нельзя сделать то что вы хотите
Можно сделать на OnModelCreating (ссылка на метанит от Андрея //извиняюсь перед модератором, что присудил ответ другому Dr9vik - но я так посчитал правильнее! Спасибо ему Dr9vik , хоть он через сервис и заполнение чуть внешнее).
Попробывал на проекте с нуля (на тех же класах -моих) там пошло. Единственное, там работает (в новом проекте) - в своем пока вожусь, но думаю что решу... Решил написать, может кто читает - может кому понадобится (грабли на которые наступаю, OnModelCreating:
1) обязательное заполнение Id-ов
2) OnModelCreating, срабатывает два раза
C#
1
2
3
        
Database.EnsureDeleted();
Database.EnsureCreated();
//в проекте с нуля все работает, независомо что запускает два раза OnModelCreating, в "своем" ругается на установку повторно поля "The seed entity for entity type 'WordEng' cannot be added because another seed entity with the same key value for {'Id'} has already been added".
- в проекте наврядли будет два метода "удалить, а потом создать базу". сделал чтобы срабатывал при креейт (правда по корявому, через стаическую переменную потом уберу...)
3) Класс, который зависимый (у меня в данном случае CheckWord) должен иметь ссылку на главный (у меня Word)
4) Сначала должно заполнятся Word (даже если чистый Ид), потом зависимые.
_____________________________________
п.с пока вожусь, но думаю что решу через OnModelCreating

Спасибо всем за подсказки
0
1 / 1 / 0
Регистрация: 02.10.2012
Сообщений: 110
19.10.2022, 09:48  [ТС]
но геморойно...лучше решение - всетаки не тут (не в OnModel)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.10.2022, 09:48

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

БД для чайников как заполнить базу данных
Здравствуйте, я решил освоить базы данных и попутно использовать какуюнибудь базу данных для своей работы. В общем я устанавливал ms...

Как заполнить базу данных большим количеством тестовых записей?
В книге по MySQL написано: &quot;В базу данных поместим следующее количество автоматически сгенерированных записей..&quot; и там числа от...

можете объяснить как создать и заполнить базу данных по данной теме?
4. Аэрофлот Схема БД состоит из четырех отношений: Company (ID_comp, name) Trip(trip_no, ID_comp, plane, town_from, town_to,...

Заполнить базу данных
Создать таблицу данных не проблема, если уже хоть что-то понимаешь в этом. Другое дело надо заполнить ее таблицами с текстом, если текста...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет) Содержание проекта Симуляция вековой (50 лет) экологической сукцессии в почве леса Основные участники: АМ-гриб, ЭКМ-гриб,. . .
сукцессия 23. Более физиологичная физиология, более экологичная экология, более диффурные диффуры.
anaschu 12.07.2026
Что реально нашли и починили за эти 5 часов Правило Линдемана (КПД конверсии сахара в тело, kEff) — раньше 100% полученного углерода шло прямо в биомассу гриба; теперь только kEff=0. 5 (после. . .
сукцессия 22. От артефактов к физиологии: калибровка агентной модели грибной сукцессии для воспроизведения сезонной динамики и pH-плато
anaschu 11.07.2026
Аннотация В данной работе представлена калибровка агентной модели динамики грибных сообществ (fungal-succession), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru