Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.73/64: Рейтинг темы: голосов - 64, средняя оценка - 4.73
16 / 16 / 8
Регистрация: 14.01.2013
Сообщений: 545
Записей в блоге: 2

Копирование база данных. Entity Framework

02.05.2018, 13:22. Показов 12520. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет, есть удалённая база данных, есть локальная.
Локальная база данных служит исключительно только для чтения. Я хочу скопировать записи из удаленной база дынных в локальную. Делаю так.
Запрашиваю по 10 записей с удаленной базы и просто вставляю их в локальную.
Для сохранения индекса я задаю в контексте свойство.
C#
1
HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
Некоторые записи копируются нормально, а вот связанные иерархией нет.
Моя модель данных.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    public class Sections
    {
        [Key]
        public int Id { get; set; }
        public string Header { get; set; }
        public bool Visibly { get; set; }
        
        public int? SectionsId { get; set; }
        [ForeignKey("SectionsId")]
        public Sections Parent { get; set; }
        public List<Sections> Children { get; set; }
        public List<StudentsSection> Disciples { get; set; }
 
        public Sections()
        {
            Children = new List<Sections>();
            Disciples = new List<StudentsSection>();
        }
    }
Контекст.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
 
            modelBuilder.Entity<Sections>()
                .HasMany(p => p.Children)
                .WithOptional(p => p.Parent).WillCascadeOnDelete(false);
 
            modelBuilder.Entity<Sections>()
                .HasMany(p => p.Disciples)
                .WithRequired(p => p.Sections).WillCascadeOnDelete(true);
 
            // Тут определяем какая база данных локальная или нет.
            if (Database.Connection.DataSource == "(LocalDB)\\MSSQLLocalDB")
            {
                modelBuilder.Entity<Sections>().Property(s => s.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
                modelBuilder.Entity<Sections>().Property(s => s.SectionsId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
 
            }
            base.OnModelCreating(modelBuilder);
        }
Получил из удаленной базы list, вставляю в локальную.
Вставка в локальную.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        public bool SetSections(List<Sections> list)
        {
            using (DateBase Base = new DateBase())
            {
                try
                {
                    Base.Sectionss.AddRange(list);
                    Base.SaveChanges();
                }
                catch (SqlException e)
                {
                    return false;
                }
            }
            return true;
        }
А это тварь выдаёт ошибку при вставке.
HTML5
1
SqlException: Violation of PRIMARY KEY constraint 'PK_dbo.Sections'. Cannot insert duplicate key in object 'dbo.Sections'. The duplicate key value is (1).
Это ошибка из-за ключа, но почему она обрабатывается? Я же все отключил.

Подскажите, как мне исправить ситуацию? У меня там связанные данных SectionsId ссылается на Id. И как мне все это грамотно скопировать с сохранением связей? Спасибо!

Добавлено через 6 минут
У меня Id разный.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.05.2018, 13:22
Ответы с готовыми решениями:

Entity Framework Core копирование данных
Ситуация такая, из одной бд, добавляю одно поле и записываю в другую бд. public class RepositoryShared : DbContext { ...

Entity Framework: Изменилась база данных, что и как поменять в приложении, чтобы оно работало?
Привет! Есть приложение ASP.NET MVC, в котором использую EntityFramework. Точно не помню как создавал приложение изначально (Code...

В чем разница между Entity Framework и Entity Framework Core?
В чем разница (если она есть) между entity framework и entity framework core?

22
Эксперт .NET
 Аватар для Usaga
14147 / 9375 / 1351
Регистрация: 21.01.2016
Сообщений: 35,328
02.05.2018, 16:27
updaite, ну и что вам в сообщении об ошибке не понятно? Нельзя вставить две и более записей с одинаковым значением первичного ключа. В тексте ошибки так и сказано.
0
16 / 16 / 8
Регистрация: 14.01.2013
Сообщений: 545
Записей в блоге: 2
02.05.2018, 17:07  [ТС]
Usaga, Так от куда они взялись эти данные? Приходит как положено 4 элемента с разными Id
0
Эксперт .NET
 Аватар для Usaga
14147 / 9375 / 1351
Регистрация: 21.01.2016
Сообщений: 35,328
02.05.2018, 17:11
updaite, что значит "откуда"? Когда вы аттачите к контексту сущность и сотворяете над ней "Add", то все её зависимости, которые контексту не известы, тоже встают в очередь на добавление.

Если кратко и на пальцах: если вы вставляете в базу сущности "А" и "Б", которые ссылаются на "В", то "А" вставит "В", а вставка "Б" зафейлится с той ошибкой, которую вы и имеете, так как будет попытка повторной вставки "В".

Ну и если локальная база не пустая, то дубликаты вообще нормальное дело.
0
16 / 16 / 8
Регистрация: 14.01.2013
Сообщений: 545
Записей в блоге: 2
02.05.2018, 19:18  [ТС]
Usaga, как в таком случае перенести записи из одной БД в другую? Возможно ли это отключить средствами EF?
0
Эксперт .NET
 Аватар для Usaga
14147 / 9375 / 1351
Регистрация: 21.01.2016
Сообщений: 35,328
02.05.2018, 19:20
updaite, я бы такое переносил чистым SQL, без всяких ORM, которые тут больше мешаются, чем помогают. Основная идея: проверять наличие записи, перед переносом.
0
16 / 16 / 8
Регистрация: 14.01.2013
Сообщений: 545
Записей в блоге: 2
02.05.2018, 19:31  [ТС]
Usaga, Я не понимаю, в удалённой базе есть 4 записи, которые ссылаются друг на друга в одной таблицы. Я их забираю от удаленной и просто вставляю в уделённую базу. AddRange они же существуют в коллекции. На чистом sql уже не выйдет, проект на EF. Переделывать время. По-любому можно как нибудь перенести эти данные без всяких ошибок.
0
Эксперт .NET
 Аватар для Usaga
14147 / 9375 / 1351
Регистрация: 21.01.2016
Сообщений: 35,328
02.05.2018, 19:35
updaite, я вам уже объяснил суть проблемы: не надо вставлять то, что уже вставлено. EF тут не виноват ни в чём.
0
16 / 16 / 8
Регистрация: 14.01.2013
Сообщений: 545
Записей в блоге: 2
02.05.2018, 19:42  [ТС]
Usaga, Я понимаю, что вы имеете ввиду. Но я хочу сделать это так. Есть база пустая табличка, в эту пустую табличку я вставляю данные 4 штуки. Методом AddRange, эти записи связанны. Мне не нужно вставлять связанные записи автоматически, я хочу это делать кодом, методом AddRange. Ибо я на 100% уверен, что табличка пустая. Мой вопрос заключается в том, как отключить автоматическое создание сущности, или как разом вставить связанные сущности в базу данных. Проверки совсем не нужны наиналичие, я только создал эту бд и все копирую в неё.
0
Эксперт .NET
 Аватар для Usaga
14147 / 9375 / 1351
Регистрация: 21.01.2016
Сообщений: 35,328
02.05.2018, 19:45
updaite, я вам ещё раз повторяю: проверка уникальности первичного ключа происходит в самой СУБД. Это неотъемлемая часть сохранения целостности данных.

Если вы хотите обойти ошибку, что описана в данной теме, то вам придётся проверять наличие записи с ID равным ID вставляемой записи. Всё.
0
16 / 16 / 8
Регистрация: 14.01.2013
Сообщений: 545
Записей в блоге: 2
02.05.2018, 19:47  [ТС]
Есть вариант решения такой, что я кодом связываю эти записи: 1 объект родитель, 2 объект ссылается на подителя, 3 объект ссылается на 2 объект и т.д.
В итоге я вставляю только один 1 объект, остальные создаются. Но почему я не могу просто взять из одной базы все записи и просто вставить в другую.
0
Эксперт .NET
 Аватар для Usaga
14147 / 9375 / 1351
Регистрация: 21.01.2016
Сообщений: 35,328
02.05.2018, 19:48
Лучший ответ Сообщение было отмечено updaite как решение

Решение

Цитата Сообщение от updaite Посмотреть сообщение
Но почему я не могу просто взять из одной базы все записи и просто вставить в другую.
Я выше описал почему: EF не проверяет наличие записи с идентичным ID. Вообще. Это на вашей совести. Как вам это ещё объяснить?
0
HF
 Аватар для HF
1314 / 893 / 200
Регистрация: 09.09.2011
Сообщений: 2,659
Записей в блоге: 2
02.05.2018, 20:24
Цитата Сообщение от updaite Посмотреть сообщение
Подскажите, как мне исправить ситуацию? У меня там связанные данных SectionsId ссылается на Id. И как мне все это грамотно скопировать с сохранением связей? Спасибо!
(если отбросить всю глупость идеи и реализацию)
Если уж эта БД только для чтения и она является типа полной копией, то Точно нужно отключить генерацию ID и других ключей. Иначе эти данные Не будут идентичны. Полная идентичность возможна только при зеркализации или извращённых копированиях, но направленных на полное сохранение идентичности.

Поэтому отключайте автогенерацию и всё у вас будет работать. (при условии конечно что конечная таблица действительно пустая).
А в таком случае я бы тоже сделал копирование через процедуру. Она сделает быстрее и без ненужных затрат ресурсов при копировании.
0
16 / 16 / 8
Регистрация: 14.01.2013
Сообщений: 545
Записей в блоге: 2
03.05.2018, 11:28  [ТС]
Начинаю проверять, есть ли уже запись в БД или нет.

Получаю.
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
using (DateBase Base = new DateBase())
            {
                try
                {
                    for(int i = 0; i < list.Count; i++)
                    {
                        Advert advert = Base.Adverts.Where(w => w.Id == list[i].Id).SingleOrDefault();
                        if(advert != null)
                        {
                            Base.Entry(advert).CurrentValues.SetValues(list[i]);
                        }
                        else
                        {
                            Base.Adverts.Add(list[i]);
                        }
                    }
                    
                    Base.SaveChanges();
                }
                catch(SqlException e)
                {
                    return false;
                }
            }
C#
1
LINQ to Entities does not recognize the method 'ModelDate.Model.Advert get_Item(Int32)' method, and this method cannot be translated into a store expression."
Всё работает против меня

Добавлено через 14 минут
Сделал.
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
            using (DateBase Base = new DateBase())
            {
                try
                {
                    for (int i = 0; i < list.Count; i++)
                    {
                        int index = list[i].Id;
                        Schedule Schedule = Base.Schedules.Where(w => w.Id == index).SingleOrDefault();
                        if (Schedule != null)
                        {
                            Base.Entry(Schedule).CurrentValues.SetValues(list[i]);
                        }
                        else
                        {
                            Base.Schedules.Add(list[i]);
                        }
                    }
                    //Base.Schedules.AddRange(list);
                    Base.SaveChanges();
#if DEBUG
                    List<Schedule> test = Base.Schedule.ToList();
#endif
                }
                catch (SqlException e)
                {
                    return false;
                }
            }
0
Эксперт .NET
 Аватар для Usaga
14147 / 9375 / 1351
Регистрация: 21.01.2016
Сообщений: 35,328
03.05.2018, 11:46
updaite, может проще сносить локальную базу и данными с удалённой полностью наполнять? Ведь, если локальная база у вас только для чтения, то новых данных в ней не появится без вашего ведома. А так вы тупую работу совершаете ища и обновляя существующие записи.
0
16 / 16 / 8
Регистрация: 14.01.2013
Сообщений: 545
Записей в блоге: 2
03.05.2018, 12:03  [ТС]
Usaga, Тоже как вариант, но она используется постоянно, сносить не могу и подменять тоже во время исполнения.
Этим кодом который выше, я просто наполняю чистую базу данных. Действительно, связанные сущности создавались автоматически, их я просто обновляю на свои, которые не успел вставить. Самое веселое у меня сейчас, сравнение по Hash таблице. Гляну совпадают ли хеши или нет. Хорошее решение требует времени, а времени у меня нет. Пожертвую производительностью, нагрузка на чтение не очень большая. 1 запрос в 5 сек. А вот к удалённой может быть и больше, поэтому ни хочу сжирать трафик, проще кусками обновлять со стороны клиента (Локалки) и все сравнения производить здесь же.
0
Эксперт .NET
 Аватар для Usaga
14147 / 9375 / 1351
Регистрация: 21.01.2016
Сообщений: 35,328
03.05.2018, 12:15
Цитата Сообщение от updaite Посмотреть сообщение
Этим кодом который выше, я просто наполняю чистую базу данных.
Тогда проверка на существование записей становится в двойне глупым делом. Тогда уж проверяйте по ID и всё, не надо обновлять то, что только что было добавлено.

Цитата Сообщение от updaite Посмотреть сообщение
А вот к удалённой может быть и больше, поэтому ни хочу сжирать трафик, проще кусками обновлять со стороны клиента (Локалки) и все сравнения производить здесь же.
Вот это ну очень спорный момент. Очень. Если вы будете обновлять базу кусками, то рискуете перевести копию базы в неконсистентное состояние. К примеру, когда между вашими чтениями состояние удалённой базы изменилось (что-то добавили\удалили).

Если же вы попытаетесь выполнить перенос в одну транзакцию с высоким уровнем изоляции (как минимум Read Commited Snapshot), то вы "взвесите" удалённую базу, ибо другие транзакции встанут в очередь пока текущая не завершится. А завершаться она может долго, в зависимости от количества данных.

В общем, тут надо крепко подумать что и как делать. Выбранный вами подход сильно не оптимален и чреват хренью в базе.
0
16 / 16 / 8
Регистрация: 14.01.2013
Сообщений: 545
Записей в блоге: 2
03.05.2018, 12:48  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Тогда проверка на существование записей становится в двойне глупым делом. Тогда уж проверяйте по ID и всё, не надо обновлять то, что только что было добавлено.
Может быть такая ситуация.
Есть сущности А, Б. Сущность А ссылается на сущность Б. При добавлении сущности А, база автоматически создаёт сущность Б, а сущность Б у меня уже есть, я ее просто обновляю на свою.

Как бы вы реализовали? Такое обновление? Мб как нибудь средствами SQL Server упаковывать таблицу в файл, а потом этот файл загружать и распаковывать на локалке?
0
Эксперт .NET
 Аватар для Usaga
14147 / 9375 / 1351
Регистрация: 21.01.2016
Сообщений: 35,328
03.05.2018, 12:59
Цитата Сообщение от updaite Посмотреть сообщение
Есть сущности А, Б. Сущность А ссылается на сущность Б. При добавлении сущности А, база автоматически создаёт сущность Б, а сущность Б у меня уже есть, я ее просто обновляю на свою.
Создаёте не база, создаёт EF.

Цитата Сообщение от updaite Посмотреть сообщение
Как бы вы реализовали?
Я бы тупо снял бекап и развернул у себя. Всё. Нуль геморроя. Это даже в коде можно делать, главное, чтобы был доступ к файловой системе сервера СУБД.
1
16 / 16 / 8
Регистрация: 14.01.2013
Сообщений: 545
Записей в блоге: 2
03.05.2018, 13:27  [ТС]
Usaga, Я уже почти все сделал. Переделывать не буду, если ничего серьёзного возникать не будет. Времени на это нет. Сделал мнение, что все ORM включая EF шляпа. Лучше на чистом SQL все делать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.05.2018, 13:27
Помогаю со студенческими работами здесь

Автообновление данных с Entity Framework
В составе C# и MSSQL пишу многопользовательскую программу (по сути простой учёт продукции на складах). Использую Entity Framework для...

Обновление данных в Entity Framework
Всем привет, помогите пожалуйста. вот есть такой код testentityEntities creat = new testentityEntities(); user...

Добавление данных в таблицу. Entity framework
Здравствуйте, не могу добавить новую запись в базу данных с помощью EF. Form1 main = this.Owner as Form1; Group Gr = new...

Entity Framework не создает базу данных
Здравствуйте. возникла какая-то непонятная проблема. работал с проектом в visual studio (база создавать через code first entity framework),...

Синхронизация баз данных Entity Framework
Добрый день! Есть две базы данных(SQL Express) одинаковые по структуре на двух разных машинах, на одной добавляются данные в базу на...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru