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

Entity Framework дублирует записи

26.08.2016, 12:12. Показов 2033. Ответов 0

Студворк — интернет-сервис помощи студентам
Привет!
Разрабатываю проект с использованием EF Code First
Имеются технические карточки:
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
    public class TechnicalCard
    {
        [Required]
        public int TechnicalCardId { get; set; }
        [Required]
        public int OrderId { get; set; }
        [Required]
        public virtual Appointment Appointment { get; set; }
        [Required]
        public virtual Diameter Diameter { get; set; }
        [Required]
        public int Number { get; set; } = 1;
        [Required]
        public virtual Material Material { get; set; }
        [Required]
        public virtual VerticalSize VerticalSize { get; set; }
        [Required]
        public virtual HorizontalSize HorizontalSize { get; set; }
        [Required]
        public virtual Offset Offset { get; set; }
    }
 
    public class Appointment
    {
        [Required]
        public int AppointmentId { get; set; }
        [Required]
        [StringLength(50)]
        public string Name { get; set; }
 
        public override string ToString() => Name;
        public override bool Equals(object obj) => AppointmentId == (obj as Appointment).AppointmentId;
    }
 
    public class Diameter
    {
        [Required]
        public int DiameterId { get; set; }
        [Required]
        public int Value { get; set; }
 
        public override string ToString() => Value.ToString();
        public override bool Equals(object obj) => DiameterId == (obj as Diameter).DiameterId;
    }
 
    public class Material
    {
        [Required]
        public int MaterialId { get; set; }
        [Required]
        [StringLength(50)]
        public string Name { get; set; }
 
        public override string ToString() => Name;
        public override bool Equals(object obj) => MaterialId == (obj as Material).MaterialId;
    }
 
    public class VerticalSize
    {
        [Required]
        public int VerticalSizeId { get; set; }
        [Required]
        public float Value { get; set; }
 
        public override string ToString() => Value.ToString();
        public override bool Equals(object obj) => VerticalSizeId == (obj as VerticalSize).VerticalSizeId;
    }
 
    public class HorizontalSize
    {
        [Required]
        public int HorizontalSizeId { get; set; }
        [Required]
        public float Value { get; set; }
 
        public override string ToString() => Value.ToString();
        public override bool Equals(object obj) => HorizontalSizeId == (obj as HorizontalSize).HorizontalSizeId;
    }
 
    public class Offset
    {
        [Required]
        public int OffsetId { get; set; }
        [Required]
        public float Value { get; set; }
 
        public override string ToString() => Value.ToString();
        public override bool Equals(object obj) => OffsetId == (obj as Offset).OffsetId;
    }
Имеется класс TechnicalInfoPage для отображения этих тех.карт, наследуется от ContentControl (WPF)
В конструкторе я заполняю ComboBox'ы:
C#
1
2
3
4
5
6
7
8
9
        private void LoadFieldsFromDb()
        {
            context.Appointments.ToList().ForEach(x => cbAppointment.Items.Add(x));
            context.Diameters.ToList().ForEach(x => cbDiameter.Items.Add(x));
            context.Materials.ToList().ForEach(x => cbMaterial.Items.Add(x));
            context.VerticalSizes.ToList().ForEach(x => cbVerticalSize.Items.Add(x));
            context.HorizontalSizes.ToList().ForEach(x => cbHorizontalSize.Items.Add(x));
            context.Offsets.ToList().ForEach(x => cbOffset.Items.Add(x));
        }
и затем выбираю в этих комбобоксах элементы:
C#
1
2
3
4
5
6
7
8
9
10
11
12
        private void FillPage(TechnicalCard technicalCard)
        {
            this.technicalCard = technicalCard;
            if (technicalCard == null) return;
            cbAppointment.SelectedItem = technicalCard.Appointment;
            cbDiameter.SelectedItem = technicalCard.Diameter;
            tbNumber.Text = technicalCard.Number.ToString();
            cbMaterial.SelectedItem = technicalCard.Material;
            cbVerticalSize.SelectedItem = technicalCard.VerticalSize;
            cbHorizontalSize.SelectedItem = technicalCard.HorizontalSize;
            cbOffset.SelectedItem = technicalCard.Offset;
        }
После редактирования карточки, я возвращаю ее:
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
        public TechnicalCard GetCard()
        {
            if (technicalCard == null)
                technicalCard = new TechnicalCard();
 
            Appointment appointment = (Appointment)cbAppointment.SelectedItem;
            ...
 
            Diameter diameter = (Diameter)cbDiameter.SelectedItem;
            ...
 
            int number = 1;
            int.TryParse(tbNumber.Text, out number);
 
            Material material = (Material)cbMaterial.SelectedItem;
            ...
 
            VerticalSize verticalSize = (VerticalSize)cbVerticalSize.SelectedItem;
            ...
 
            HorizontalSize horizontalSize = (HorizontalSize)cbHorizontalSize.SelectedItem;
            ...
 
            Offset offset = (Offset)cbOffset.SelectedItem;
            ...
 
            technicalCard.Appointment = appointment;
            technicalCard.Diameter = diameter;
            technicalCard.Number = number;
            technicalCard.Material = material;
            technicalCard.VerticalSize = verticalSize;
            technicalCard.HorizontalSize = horizontalSize;
            technicalCard.Offset = offset;
 
            return technicalCard;
        }
Вызывающий код:
C#
1
2
            var technicalCards = (icTechnicalCards.ItemsSource as List<TechnicalInfoPage>).ConvertAll(x => x.GetCard());
            context.SaveChanges();
так вот, при SaveChanges() в таблицы Appointments, Diameters, ... добавляются дублирующие записи с новым Id, но таким же как и у выбранного Name/Value, хотя при отладке видно, что Id у них существующий
Добавил к полям атрибут [Index(IsUnique = true)] - при попытке SaveChanges() выдает эксепшн: "Повторяющееся значение невозможно вставить в уникальный индекс. [ Table name = Appointments,Constraint name = IX_Name ]"

Добавлено через 3 часа 44 минуты
Решение на ruSO (ссылка удалена модератором)
Использовал разные экземпляры Context при сохранении...
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.08.2016, 12:12
Ответы с готовыми решениями:

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

Реализация редактирования записи с entity framework
Уважаемые Гуру! Ищу стандартные приемы редактирования записей при работе с EF. При работе с dataset использовал propertyGrid. В asp.net...

Entity Framework - отобразить все записи из таблицы в DataGridView
Здравствуйте! Проект Windows Forms. Есть сущность созданная EF: public partial class Country { public Country() ...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.08.2016, 12:12
Помогаю со студенческими работами здесь

Entity Framework + Firebird вернуть ID только что вставленной записи
В общем вставляю новую запись в Firebird таблицу через Entity Framework: using (MyEntity context = new MyEntity ()) ...

Entity Framework. Удаление entity без удаления связей
Вечер добрый. Есть модель Coder First. Каскадное удаление запрещено. Удаление произвожу так: try { ...

Entity Framework 6
Нарисовалась неожиданная проблемка. Штудирую Троелсена, там описание Framework 4, у меня 6-я версия. Один из примеров пришлось...

Entity framework One vs Zero-or-One
При настройке ассоциаций между двумя сущностями можно выбрать чтобы на конце связь была &quot;один&quot; и &quot;ноль или один&quot;-не...

Entity Framework и абстракции
Можно сказать &quot;новичковый&quot; вопрос :) Есть сущности, созданные из базы данных. Database First. К примеру, код только как пример, в...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это дополнительная запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru