Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
 Аватар для bodynar
345 / 307 / 135
Регистрация: 14.03.2015
Сообщений: 1,158
Записей в блоге: 1
MS SQL

Подгрузка коллекций

07.10.2016, 10:17. Показов 835. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток, комрады.

Столкнулся с проблемой (раз 4 суюсь в бд и EF).

Имеют классы:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
public class Product
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int? OrderId { get; set; }
        public Order Order { get; set; }
    }
C#
1
2
3
4
5
6
7
8
9
10
11
12
public class Order
    {
        public int Id { get; set; }
        public string Customer { get; set; }
        public ICollection<Product> Product { get; set; }
 
        public Order()
        {
            Product = new List<Product>();
        }
 
    }
C#
1
2
3
4
5
6
7
8
9
class UserContext : DbContext
    {
        public UserContext()
            : base("DbConnection")
        { }
 
        public virtual DbSet<Order> Orders { get; set; }
        public virtual DbSet<Product> Products { get; set; }
    }
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
static void Main(string[] args)
        {
            using (UserContext db = new UserContext())
            {
                AddToDataBase(db);
 
                // получаем объекты из бд и выводим на консоль
 
                Console.Clear();
                var orders = db.Orders.ToList();
                foreach (var order in orders)
                {
                    Console.ForegroundColor = ConsoleColor.Green;
                    Console.WriteLine("{0}.{1}", order.Id, order.Customer);
 
                    if (order.Product.Count > 1)
                    {
                        Console.ForegroundColor = ConsoleColor.Yellow;
                        foreach (var pr in dp.Product)
                        {
                            Console.WriteLine("{0}.{1}", pr.Id, pr.Name);
                        }
                    }
                }
            }
            Console.Read();
        }
 
        private static void AddToDataBase(UserContext db)
        {
            var pr1 = new Product() { Name = "phone" };
            var pr2 = new Product() { Name = "car" };
 
            db.Products.Add(pr1);
            db.Products.Add(pr2);
 
            db.SaveChanges();
 
            var ord1 = new Order() { Customer = "Denis", Product = new Collection<Product>() { pr1 } };
            var ord2 = new Order() { Customer = "test", Product = new Collection<Product>() { pr2 } };
 
            Console.WriteLine("Объекты созданы.");
 
            db.Orders.Add(ord1);
            db.Orders.Add(ord2);
 
            db.SaveChanges();
 
            Console.WriteLine("Объекты успешно сохранены");
        }
XML
1
2
3
 <connectionStrings>
   <add name="DBConnection" connectionString="data source=(localdb)\v11.0;Initial Catalog=test.mdf;Integrated Security=True;" providerName="System.Data.SqlClient" />
 </connectionStrings>


Бд создаю Microsoft SQL server, как указано в заголовке. (localdb)\v11.0 в файл .mdf.

Проблема заключается в том, что при втором запуске (без выполнения метода AddToDataBase) значение свойства Product становится равным новому экземпляру List<Product>.

Т.е. в 1й запуск были созданы объекты и записаны. В последующий запуск не все отображаются. Коллекция Product не имеет элементов.

Кто может подсказать в чем проблема?

Спасибо.

Добавлено через 8 часов 58 минут
Была ещё идея отказаться от такой структуру в пользу этой.
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
public class Product
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int? OrderId { get; set; }
        public Order Order { get; set; }
    }
C#
1
2
3
4
5
public class Order
    {
        public int Id { get; set; }
        public string Customer { get; set; }
    }
Уверен, что такая будет работать, но, по моему, она не совсем корректна.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.10.2016, 10:17
Ответы с готовыми решениями:

Как долго будет выполняться сравнение коллекций?
Добрый день! Суть программы такая. Отправляется запрос на сайт, ответ приходит в виде JSON, в котором содержится 100 последних действий,...

Подгрузка данных в DataGridView
Добрый вечер. Суть проблемы, необходимо через DataGridView просматривать большое количество данных, более 150000. При загрузке данных...

Подгрузка картинки к picturebox из базы данных
Доброго времени суток! У меня такой вопрос: Мне нужно по клику в датагриде вывести в picturebox соответствующую этой строке фото ( есть...

3
785 / 616 / 273
Регистрация: 04.08.2015
Сообщений: 1,713
07.10.2016, 11:27
Цитата Сообщение от bodynar Посмотреть сообщение
Была ещё идея отказаться от такой структуру в пользу этой.
Откажитесь от обеих, т.к. они обе неработоспособны. В инете полно примеров работы с подобными классами, вот вам ссылка:
http://professorweb.ru/my/enti... l2/2_6.php
C#
1
2
3
4
5
6
7
public class Product
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int? OrderId { get; set; }
        public Order Order { get; set; }
    }
OrderId и Order - это масло масленое.
Допустим, у вас 2 заказа одного продукта. Тогда вам понадобится создать 2 записи, т.к. OrderId у них разные. Но т.к. продукты одинаковые, то Id тоже должен быть одинаковым. Но Id - первичный ключ, он не может быть одинаковым.
1
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18264 / 14189 / 5366
Регистрация: 17.03.2014
Сообщений: 28,876
Записей в блоге: 1
07.10.2016, 12:45
bodynar, не хватает ключевого слова virtual в классе Order
C#
1
public virtual ICollection<Product> Product { get; set; }
Добавлено через 1 час 1 минуту
bodynar, еще тебе следует прислушаться к совету Igr_ok насчет переделки модели. Классический подход к хранению заказов выглядит так:
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
public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
 
    public Product()
    {
    }
}
public class Order
{
    public int Id { get; set; }
    public string Customer { get; set; }
    public DateTime OrderDate { get; set; }
    public virtual ICollection<OrderDetail> Details { get; set; }
 
    public Order()
    {
        Details = new HashSet<OrderDetail>();
    }
}
public class OrderDetail
{
    public int Id { get; set; }
    public Order Order { get; set; }
    public virtual Product Product { get; set; }
}
class UserContext : DbContext
{
    public UserContext()
        : base("name=DbConnection")
    {
        //Database.SetInitializer(new DropCreateDatabaseIfModelChanges<UserContext>());
    }
 
    public virtual DbSet<Order> Orders { get; set; }
    public virtual DbSet<Product> Products { get; set; }
    public virtual DbSet<OrderDetail> Details { get; set; }
}
2
 Аватар для bodynar
345 / 307 / 135
Регистрация: 14.03.2015
Сообщений: 1,158
Записей в блоге: 1
07.10.2016, 18:38  [ТС]
Igr_ok, OwenGlendower, видимо я плохой пример выбрал для темы.

В моем случае связь между сущностями 1 ко многим дважды. Например студент, группа и университет.
Вот такая структура бы подошла?
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
public class Student
    {
        public int Id { get; set; }
        public string FullName { get; set; }
        public Group Group{ get; set; }
    }
C#
1
2
3
4
5
6
7
8
public class Group
    {
        public int Id { get; set; }
        public int Number { get; set; }
        public virtual ICollection<Student> Student { get; set; }
        ctor()
        { Student = new List<Student>(); }
    }
C#
1
2
3
4
5
6
7
8
public class University
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public virtual ICollection<Group> Group { get; set; }
        ctor()
        { Group = new List<Group>(); }
    }

Прошу прощения, что туп как пробка.

OwenGlendower, насколько я понимаю, предложенная вами структура подходит только для связи многие-ко-многим?

Добавлено через 1 час 23 минуты
Забыл добавить условие (условно), что университет без групп существовать не может.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.10.2016, 18:38
Помогаю со студенческими работами здесь

Свойства коллекций
Господа, ПОМОГИТЕ плз ! Всю голову сломал. Почему игнорируется сеттер ? Выводится 3 раза &quot;hello&quot;. Даже если...

Сравнение коллекций
есть кулинарная книга. в которой нужно сделать поиск по рецептам(пользователь вводит неизвестное заранее количество ингридиентов) затем...

Быстрое сравнение коллекций
Есть 2 коллекции List&lt;SomeItem&gt;. Одна исходная, с другой работаю. Каким образом можно в коде (к примеру по какому либо моему событию)...

Сериализация разнотипных коллекций с помощью BinaryFormatter
Привет всем! Подскажите пожалуйста как сериализовать две раснотипные коллекции в одном файле с помощью BinaryFormatter ?

Сериализация массива коллекций ObservableCollection в xml
Доброго времени суток, Имеется три коллекции ObservableCollection&lt;MyClass&gt;, в которых хранятся экземпляры класса MyClass: public...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru