Форум программистов, компьютерный форум, киберфорум
C#: Базы данных, ADO.NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/21: Рейтинг темы: голосов - 21, средняя оценка - 4.67
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
1

Как создать БД с множеством вопросов для игры

05.10.2012, 11:16. Показов 4242. Ответов 30
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте. Скорее всего нубский вопрос, но не могу ничего поделать: из-за того, что тестовый серверв от MS у меня не хочет идти, самообучение СУБД получается не очень. Пишу игру наподобие "кто хочет стать миллионером". Имеется класс "вопрос". Собственно, задача: создать БД с множеством этих вопросов. Вот так выглядит класс вопроса
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
namespace Millioner
{
    class Question
    {
        private readonly string _question;
        private readonly string[] _variantes = new string[4];
        private readonly int _rightVariant;
        public byte Level { get; private set; }
 
        public Question(string question, string[] variantes, int rightVariant,byte level)
        {
            _question = question;
            _variantes = variantes;
            _rightVariant = rightVariant;
            Level = level;
        }
 
        public string Get()
        {
            return _question;
        }
 
        public string[] GetVariantes()
        {
            return _variantes;
        }
 
        public bool IsRight(string answer)
        {
            return answer == _variantes[_rightVariant];
        }
    }
}
Подскажите, пожалуйста, как сделать)
Бд подойдет MS SQL или MySQL
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.10.2012, 11:16
Ответы с готовыми решениями:

Как создать приложение с множеством панелей?
Здравствуйте, я раньше программировал в основном в eclipse на java на начинающем уровне так...

Как создать ландшафт для игры?
Хочу создать ландшафт для игры, может кто подскажет как лучше это сделать?

Как создать чит для игры?
Всем привет. Я хотел спросить как создать трейнер на C#. При запуске эта программа должна проверять...

Есть форма со множеством полей ввода. Как создать объект?
Пишу приложение о банках Есть меню, где можно выбрать добавить банк. Класс должен содержать...

30
1245 / 1055 / 293
Регистрация: 07.03.2012
Сообщений: 3,245
05.10.2012, 12:34 2
по-моему, принципы работы с бд везде примерно одинаковы? не знаешь как создать таблицы-связи-ключи? а то я никак не въеду в суть вопроса
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
05.10.2012, 18:39  [ТС] 3
Монфрид,
не знаешь как создать таблицы-связи-ключи? а то я никак не въеду в суть вопроса
да, не знаю. Просто на конкретном примере легче понять, я уже давно это понял. Вот и решил так сделать. Обращаться к БД я худо-бедно умею, а вот заполнять - нет. Я ж говорю, вопрос нубский, но с БД я не работал, в универек курс СУБД читают в 8-9 семестре, ждать столько нереально. В книжке же по СУБД написано поставить managment studio, которая почему-то у меня ставиться не хочет. Поэтому такие завтыки.

Добавлено через 5 часов 25 минут
Я так понимаю, что вопрос настолько дурацкий, что всем влом отвечать, но я бы не стал его задавать, предварительно не воспользовавшись книжками/msdn/гуглом/мозгом

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

Добавлено через 12 минут
Смысл в том, что мне не нужно привязываться к датагриду и прочему. Я хочу в БД хранить список вопросов, после этого во время игры я посылаю запрос на получение случайной записи нужного уровня сложности. То есть я могу получить все записи
C#
1
SELECT * FROM bd WHERE Level = level
и отсюда уже выбирать случайную запись, но хотелось бы возложить это дело на БД
0
1245 / 1055 / 293
Регистрация: 07.03.2012
Сообщений: 3,245
05.10.2012, 18:52 4
тебе linq подойдёт. Хотя раз с бд у тебя проблемы, я не знаю насколько ты знаком с этой технологией. Возможно, вечером приду и что нить напишу тебе. А для чего тебе программно создавать бд? В смысле что так больше проблем..
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
05.10.2012, 18:58  [ТС] 5
Монфрид, в том смысле, что managment studio у меня не идет, остается только программное создание. С linq у меня все порядке.
на linq'е я бы так написал
C#
1
2
var questions = bd.Where(x=>x.Level == level).Select(x=>x);
var question = question.GetElementAt(random.Next() % questions.Count);
0
1245 / 1055 / 293
Регистрация: 07.03.2012
Сообщений: 3,245
05.10.2012, 19:08 6
можно access и entity framework
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
05.10.2012, 19:09  [ТС] 7
Монфрид, акцесс бяка, в EF никогда не работал, но хотел бы попробовать.В целом это же для этого и делается: для обучения (ну и параллельно выполнения курсача).
0
1245 / 1055 / 293
Регистрация: 07.03.2012
Сообщений: 3,245
05.10.2012, 20:08 8
если у тебя MS стоит, то ты можешь создать бд локально и потом сгенерить классы EF
1
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
05.10.2012, 20:27  [ТС] 9
Монфрид, можно пример, пожалуйста?
0
Злой няш
2136 / 1505 / 565
Регистрация: 05.04.2010
Сообщений: 2,881
06.10.2012, 15:07 10
Пример POCO и стратегии Code First на новом Entity Framework в 2012 студии.
1. Создаем консольное приложение с именем ConsoleApplication.
2. Создаем класс Answer:
Класс Answer
C#
1
2
3
4
5
6
7
8
namespace ConsoleApplication
{
    public class Answer
    {
        public int Id { get; set; }
        public string Text { get; set; }
    }
}

Стоит заметить, что Id - автоинкрементное поле и ключ в базе данных - EF сам это понимает, если следовать его нотации: Id или <ClassName>Id. Однако, если имя необходимо задать другое, то может помочь атрибут Key перед свойством.
Это упрощенная, односторонняя связь сущностей, т.е. с Answer нельзя получить доступ к Question, в противном случае необходимо добавлять навигационное поле. (Один ответ может содержаться как в только одном вопросе, так и в нескольких - все зависит от ТЗ)
3. Создаем класс Question:
Question
C#
1
2
3
4
5
6
7
8
9
10
11
12
using System.Collections.Generic;
 
namespace ConsoleApplication
{
    public class Question
    {
        public int Id { get; set; }
        public string Text { get; set; }
        public virtual Answer RightAnswer { get; set; }
        public virtual ICollection<Answer> Answers { get; set; }
    }
}

RightAnswer и Answers - это навигационные поля. А модификатор virtual нужен для поддержки Lazy Loading в EF.
4. В References добавляем ссылку на EntityFramework (если нет такого, то используем Manage NuGet Packages или Package Manager Console).
5. Создаем самый важный класс, который будет выполнять функции ORM:
Класс DataContext
C#
1
2
3
4
5
6
7
8
9
10
using System.Data.Entity;
 
namespace ConsoleApplication
{
    public class DataContext : DbContext
    {
        public DbSet<Question> Questions { get; set; }
        public DbSet<Answer> Answers { get; set; }
    }
}

6. Последний штрих. Создаем App.Config (если нет) и добавляем строку подключения:
Конфигурационный файл
XML
1
2
3
4
5
6
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <connectionStrings>
    <add name="DataContext" connectionString="data source=(LocalDB)\v11.0;attachdbfilename=|DataDirectory|\Database.mdf;integrated security=True;" providerName="System.Data.SqlClient" />
  </connectionStrings>
</configuration>

Очень важно, чтобы название строки подключения совпадало с классом, описанным в пункте 5.
В принципе, базу данных можно использовать любую - хоть MsSql, хоть MySql, да тот же FireBird при желании. Главное правильно задать connectionString, providerName и установить правильный коннектор (для MsSql установлен по умолчанию).
7. Пишем тестовое приложение:
Основная программа
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
using System;
using System.Linq;
 
namespace ConsoleApplication
{
    internal class Program
    {
        private static void Main()
        {
            AppDomain.CurrentDomain.SetData("DataDirectory", Environment.CurrentDirectory);
            using (var context = new DataContext())
            {
                context.Answers.Add(new Answer {Text = "Answer 1"});
                context.Answers.Add(new Answer {Text = "Answer 2"});
                context.Answers.Add(new Answer {Text = "Answer 3"});
                context.SaveChanges();
 
                var answers = context.Answers.ToList();
                context.Questions.Add(new Question {Text = "Question", Answers = answers, RightAnswer = answers[1]});
                context.SaveChanges();
 
                var question = context.Questions.FirstOrDefault(q => q.Text == "Question");
                Console.WriteLine("Question:");
                Console.WriteLine("Id = {0}", question.Id);
                Console.WriteLine("Text = {0}", question.Text);
                foreach (var answer in question.Answers)
                    Console.WriteLine("{0}: {1}", answer.Id, answer.Text);
                Console.WriteLine("The right answer {0}: {1}", question.RightAnswer.Id, question.RightAnswer.Text);
            }
        }
    }
}

Пару слов о DataDirectory: это такая папка, где находятся базы данных приложения. В случае с консольным приложением ее необходимо явно задавать через AppDomain.
Все операции (CRUD - create, read, update, delete) с базой данных отложены (применяется транзакция). Для их выполнения необходимо вызвать метод SaveChanges, а перед этим операции только регистрируются в контексте.

К слову, это самый приятный способ из всех, который я когда-либо знал/использовал: мало кода, не надо ручками лезть в БД, можно использовать божественный Linq, создание БД и таблиц на лету. А если добавить еще поддержку миграций, так вообще сказка.
Так же возможна реализация с помощью ADO.NET, но он у меня вызывает попа-боль и если не обдуманно его использовать, то приложение не будет защищено от SQL-инъекций. А вот к Linq2Sql у меня нейтральное чувство.
1
1245 / 1055 / 293
Регистрация: 07.03.2012
Сообщений: 3,245
06.10.2012, 16:17 11
вот я сделал бд, может, немного неправильна структура. Наваял приложение, увлёкся и реализовал даже переход между вопросами)Tester.rar
Создать локальную бд можно так:
Как создать БД с множеством вопросов для игры

после создания бд, можно генерировать классы EF:
Как создать БД с множеством вопросов для игры
1
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
06.10.2012, 19:13  [ТС] 12
I2um1, 2 вопроса: можно ли создать БД с полями вопрос-ответ? Потому что вопрос-ответ связь 1 к 1 (1 вопрос только к 1 ответу подходит), то есть что-то вроде такого
C#
1
2
3
4
5
6
7
8
9
sing System.Data.Entity;
 
namespace ConsoleApplication
{
    public class DataContext : DbContext
    {
        public DbSet<QuestionAndAnswer> QA { get; set; }
    }
}
Или это нарушение каких-нибудь реляционных принципов?

Второе: вы говорите, что это для консольного приложения верно, а на wpf будет сильно отличаться?..

Добавлено через 39 минут
Просто я немного плохо понимаю, ведь отношение будет 1к1 (первый вопрос- первый ответ, второй вопрос - второй ответ). Поэтому логично инкапсулировать это в одном объекте вопрос-ответ. А тут как он будет связь устанавливать? В акцессе чуток работал, как там это делается знаю, а тут - нет
0
Злой няш
2136 / 1505 / 565
Регистрация: 05.04.2010
Сообщений: 2,881
06.10.2012, 20:27 13
Цитата Сообщение от Psilon Посмотреть сообщение
можно ли создать БД с полями вопрос-ответ?
Конечно можно. Можно делать все, что душе угодно, но с оговорками:
- Во-первых, не есть хорошо делать не нормализированную базу данных - считается плохим тоном. К примеру база данных из одной таблицы с 50-ю колонками - это все равно, что написать на C# один класс с 50 свойствами, в котором будет имя пользователя, адрес, паспортные данные, много чего еще, а не кучу мелких классов. Дублирование хранимой информации не избежать.
- В базе данных можно хранить только примитивные типы: целое, вещественное, строка, время, дата и т.п.. В некоторых есть поддержка Guid, blob (это массивом байтов можно считать, используется, к примеру, для хранения изображения в БД). А объект типа Question или Answer хранить можно только в виде таблиц.

Цитата Сообщение от Psilon Посмотреть сообщение
Потому что вопрос-ответ связь 1 к 1
Как я себе это понимал? Если брать за основу игру "Кто хочет стать миллионером", то у одного вопроса есть 4 вариантов ответа, из которых один правильный. Что я собственно и реализовал в примере ранее. Т.е. это пример, в котором есть связь один (вопрос) ко многим (вариантов ответа) и связь один (вопрос) к одному (правильный ответ). В принципе, ничего не мешает удалить навигационное поле Answers, а поля с Answer (в данном случае только Text) перенести в Question, но тогда база данных будет не нормализирована - дублирование данных. Т.е., если я правильно понял, то:
1 Вопрос1 Ответ1
2 Вопрос1 Ответ2
3 Вопрос1 Ответ3
4 Вопрос2 Ответ4
5 Вопрос3 Ответ1
В данном случае, будет дублироваться текст вопроса (1-3) и текст ответа (1, 5).

Цитата Сообщение от Psilon Посмотреть сообщение
вы говорите, что это для консольного приложения верно, а на wpf будет сильно отличаться?
Абсолютно все равно какое UI. Консольное приложение взято за основу, так как ничего проще нет. Можно и нужно слой работы с данными (Data Access Layer) выделять в библиотеку и подключать к нужному клиенту, будь-то Console, WinForms, Wpf, Xna, что-угодно. На ASP же некоторое вещи писать не надо или только немного подредактировать. В плане мобильных устройств не знаю, вроде EF совместим с облегченной версией .NET Framework без особых танцев с бубном.

Цитата Сообщение от Psilon Посмотреть сообщение
В акцессе чуток работал, как там это делается знаю, а тут - нет
Да смысл тот же. Я же не знаю насчет того, что должно быть.
1
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
06.10.2012, 20:54  [ТС] 14
I2um1, огромное вам спасибо за помощь. Если не возражаете, я буду к вам обращаться
Насчет написания отдельной библиотеки: я правильно понял, что лучше всего написать все в консольном приложении, протестировать, а потом как dll-ку подсоединить к wpf? Я понимаю, что вы (и товарищ Монофрид) тоже проделали огромную работу, да и стена текста с объяснениями внушает уважение, но я пока плохо понимаю, как эта БД устроена.

У нас есть "ответ", у него есть собственно айдишник и текст. Есть вопрос: у него есть поле "правильный ответ", множество возможных ответов, сам вопрос и его айдишник. Структура данных понятна. А вот структура связей - нет. Понимаю, что полный наглеж, но очень хочу разобраться, а вы на удивление разумный человек, очень приятно общаться, поняли вопрос и максимально подробно его расписали. Жалко, я не могу сразу все понять, но я обещаю стараться, если вы мне поможете)

И насчет DataDirectory, я попробовал изменить путь на
C#
1
AppDomain.CurrentDomain.SetData("DataDirectory", Environment.CurrentDirectory + "\\DB");
Он тут же начал ругаться. С чем это связано?

И еще: чтобы совсем тупыми вопросами вас не грузить: что можно почитать про БД в принципе? А то я качал и книжки из рекомендованных, и методички разные, они все связанны с программированием БД в managment studio и последующих подключениях в явном виде типа "SELECT * FROM table", собственно что меня не очень устраивает.

Насчет дублирования данных, я думал будет так


1 | Вопрос1 | Ответы1 | Номер_правильного_ответа1 | Уровень_сложности_вопроса1
2 | Вопрос2 | Ответы2 | Номер_правильного_ответа2 | Уровень_сложности_вопроса2
...

1 Ответы1 ответ11 ответ12 ответ13 ответ14
2 Ответы2 ответ21 ответ22 ответ23 ответ24
...

Примерно так я себе это представляю:
Миниатюры
Как создать БД с множеством вопросов для игры  
0
1245 / 1055 / 293
Регистрация: 07.03.2012
Сообщений: 3,245
06.10.2012, 21:00 15
если сроки не жмут, то пробуй с более простых примеров разбираться с бд. Помнится, ничего специализированного и фундаментального не читал по бд, учился на своих ошибках, постепенно наращивая сложность
1
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
06.10.2012, 21:03  [ТС] 16
Монфрид, сроки 3 недели, за это время можно новый ЯП изучить, но у меня вот с бд, говорю, не сложилось настолько, что я даже не смог научиться. Потому что любой пример начинался или с "зайдем в managment studio и создадим БД" (у меня она не ставится и в инете я её найти так и не смог), либо "давайте запустим из приложения нашу базу данных, которую мы создали в п.1"... У меня даже майкросовтофская БД тестовая (не помню название, northwind кажется) не пошла (скачал тестовую базу, скопировал пример с msdn, она выдавала ошибку).

С другой стороны, номер правильного ответа лучше вставить в таблицу "ответы" и тогда получается как-то так
Миниатюры
Как создать БД с множеством вопросов для игры  
0
Злой няш
2136 / 1505 / 565
Регистрация: 05.04.2010
Сообщений: 2,881
06.10.2012, 21:42 17
Цитата Сообщение от Psilon Посмотреть сообщение
лучше всего написать все в консольном приложении, протестировать, а потом как dll-ку подсоединить к wpf
Можно и так, если так будет проще. Просто мне все равно на чем тестировать.

Цитата Сообщение от Psilon Посмотреть сообщение
но я пока плохо понимаю, как эта БД устроена
Если говорить проще, то база данных - это заполненные таблицы с колонками и связи между таблицами (1-к-1, 1-к-многим). Для Sql сервера Express-версии и простых приложений ничего более знать и не надо, хотя дополнительные знания и помогают оптимизировать работу СУБД. (Процедуры, функции, триггеры, индексы, словари, полнотекстовый поиск...)

Цитата Сообщение от Psilon Посмотреть сообщение
Структура данных понятна. А вот структура связей - нет.
Можно реализовать и так, как на прикрепленном изображении, если удобнее:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class Question
{
    public int Id { get; set; }
    public string Text { get; set; }
    public int RightAnswer { get; set; } // Или перенести эту колонку в AnswerSet
    public int Level { get; set; }
    public virtual AnswerSet Answers { get; set; }
}
 
public class AnswerSet
{
    public int Id { get; set; }
    public string Answer1 { get; set; }
    public string Answer2 { get; set; }
    public string Answer3 { get; set; }
    public string Answer4 { get; set; }
}
 
public class DataContext : DbContext
{
    public DbSet<Question> Questions { get; set; }
    public DbSet<AnswerSet> AnswerSets { get; set; }
}
Получается связь 1 к 1 и две таблицы.

Цитата Сообщение от Psilon Посмотреть сообщение
И насчет DataDirectory, я попробовал изменить путь
Вероятнее всего из-за того, что данная папка не создана - при построении проекта, эта папка не создается. А соединять части пути лучше с помощью метода Path.Combine.

Цитата Сообщение от Psilon Посмотреть сообщение
что можно почитать про БД в принципе?
Лично я читаю блоги: кратко, ужата, в виде обзора описывают одной статьей основные моменты того или другого приема. Да и предметов, связанных с базами данных, у меня было три семестра.

Цитата Сообщение от Psilon Посмотреть сообщение
Насчет дублирования данных
Дублирование есть, попробую объяснить на простом примере (хотя в принципе пока можете не заморачиваться со всякими нормализациями):
2+2? 1, 2, 3, 4
2+2? один, два, три, четыри
1+2? 3, 4, 5, 6
Цитата Сообщение от Psilon Посмотреть сообщение
зайдем в managment studio и создадим БД
Для работы с Managment Studio необходим полноценный Sql Server, а не Express. В простом случае годится Express и закладка в Visual Studio под названием Server Explorer, в которой отображаются текущие подключения к базам данных и их внутреннее наполнение. С помощью этого обозревателя так же можно создавать базы данных, таблицы, заполнять их данными и т.п..
1
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
06.10.2012, 22:27  [ТС] 18
Не могу понять, в чем дело, ругается на то, что нету конструктора без параметров. Посмотрите, пожалуйста:
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
namespace QuestionBDTest
{
    public class Question
    {
        public int Id { get; set; }
        public string Text { get; set; }
        public byte Level { get; set; }
        public virtual AnswerSetBase AnswerSet { get; set; }
 
        public Question(string text, byte level, AnswerSetBase answers)
        {
            Text = text;
            Level = level;
            AnswerSet = answers;
        }
 
        public bool IsRightAnswer(string s)
        {
            return AnswerSet.IsRight(s);
        }
 
        public string RightAnswer
        {
            get { return AnswerSet.RightAnswer; }
        }
    }
 
 
    public class AnswerSetBase
    {
        public int Id { get; set; }
        private readonly int _rightAnswer;
        public string[] Answers { get; private set; }
 
        public string RightAnswer
        {
            get { return Answers[_rightAnswer]; }
        }
 
 
        public AnswerSetBase(byte right, params string[] answers)
        {
            if (answers.Length != 4 ) return;
            _rightAnswer = right - 1;
            Answers = answers;
        }
        
        public bool IsRight(string s)
        {
            return s.Trim() == Answers[_rightAnswer];
        }
    }
}
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
using System;
using System.Linq;
 
namespace QuestionBDTest
{
    internal class Program
    {
        private static void Main()
        {
            AppDomain.CurrentDomain.SetData("DataDirectory", Environment.CurrentDirectory);
            using (var context = new DataContext())
            {
                context.Answers.Add(new AnswerSetBase(1, "Папа карло", "Папа буратино", "Пиннокио", "Карабас-Барабас"));
                context.SaveChanges();
                var v = context.Answers.First();
                context.Questions.Add(new Question("Как звали папу буратино?", 1, v));
                context.SaveChanges();
                var question = context.Questions.FirstOrDefault(q => q.Text == "Question");
                if (question == null) return;
                Console.WriteLine("Question:");
                Console.WriteLine("Id = {0}", question.Id);
                Console.WriteLine("Text = {0}", question.Text);
                foreach (var answer in question.AnswerSet.Answers)
                    Console.WriteLine("{0}", answer);
                Console.WriteLine("Введите правильный ответ");
                var result = Console.ReadLine();
                if (question.IsRightAnswer(result))
                    Console.WriteLine("Победа");
                else
                    Console.WriteLine("Поражение. Правильный ответ: {0}!", question.RightAnswer);
                Console.ReadKey();
            }
        }
    }
}
Сам проект ниже.
Вложения
Тип файла: rar QuestionBDTest.rar (2.33 Мб, 11 просмотров)
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
06.10.2012, 22:52  [ТС] 19
Попробовал везде убрать конструктор и заменить его на object initializer и записать так, как у вас:
C#
1
 context.Answers.Add(new AnswerSetBase() { RightAnswerID = 1, Answers = new[]{ "Папа карло", "Папа буратино", "Пиннокио", "Карабас-Барабас"} });
Но выдает ошибку:
The model backing the 'DataContext' context has changed since the database was created. Consider using Code First Migrations to update the database (http://go.microsoft.com/fwlink/?LinkId=238269).
А все, понял, изменил базу, поэтому фигня. Удалил старую базу, все заработало. Спасибо большое, буду дальше разбираться, но кажется понял что к чему

Добавлено через 18 минут
Э нет, все-таки проблемы имеются. При первом запуске все в порядке, однако при повторном добавлении в базу имеющихся записей почему-то вылетает nullreference, в отладчике видно, что при втором проходе question.AnswerSet.Answers == null, почему так? И поле Id всегда равно единицы и не автоинкрементируется.
Классы элементов таблиц
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
using System;
 
namespace QuestionBDTest
{
    public class Question
    {
        public int Id { get; set; }
        public string Text { get; set; }
        public byte Level { get; set; }
        public virtual AnswerSetBase AnswerSet { get; set; }
 
 
        public bool IsRightAnswer(string s)
        {
            return AnswerSet.IsRight(s);
        }
 
 
        public string RightAnswer
        {
            get { return AnswerSet.RightAnswer; }
        }
    }
 
 
    public class AnswerSetBase
    {
        public int Id { get; set; }
        public int RightAnswerID { get; set; }
        public string[] Answers { get; set; }
 
        public string RightAnswer
        {
            get { return Answers[RightAnswerID - 1]; }
        }
 
 
        public bool IsRight(string s)
        {
            return string.Equals(s.Trim(), Answers[RightAnswerID], StringComparison.OrdinalIgnoreCase);
        }
    }
}
Программа
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
using System;
using System.Linq;
 
namespace QuestionBDTest
{
    internal class Program
    {
        private static void Main()
        {
            AppDomain.CurrentDomain.SetData("DataDirectory", Environment.CurrentDirectory);
            using (var context = new DataContext())
            {
                context.Answers.Add(new AnswerSetBase { RightAnswerID = 1, Answers = new[]{ "Папа карло", "Папа буратино", "Пиннокио", "Карабас-Барабас"} });
                context.SaveChanges();
                var v = context.Answers.FirstOrDefault();
                context.Questions.Add(new Question {Text = "Как звали папу буратино?",Level = 1,AnswerSet = v});
                context.SaveChanges();
                var question = context.Questions.FirstOrDefault();
                if (question == null) return;
                Console.WriteLine("Question:");
                Console.WriteLine("Id = {0}", question.Id);
                Console.WriteLine("Text = {0}", question.Text);
                foreach (var answer in question.AnswerSet.Answers)
                    Console.WriteLine("{0}", answer);
                Console.WriteLine("Введите правильный ответ");
                var result = Console.ReadLine();
                if (question.IsRightAnswer(result))
                    Console.WriteLine("Победа");
                else
                    Console.WriteLine("Поражение. Правильный ответ: {0}!", question.RightAnswer);
                Console.ReadKey();
            }
        }
    }
}
1
Злой няш
2136 / 1505 / 565
Регистрация: 05.04.2010
Сообщений: 2,881
06.10.2012, 23:23 20
Цитата Сообщение от Psilon Посмотреть сообщение
При первом запуске все в порядке, однако при повторном добавлении в базу
При повторном запуске старая база данных не затирается. В этом можно убедиться, применив метод Count к существующим таблицам.

Цитата Сообщение от Psilon Посмотреть сообщение
что при втором проходе question.AnswerSet.Answers == null
В некоторых специальных случаях EF не инициализирует привязанные таблицы (в данном случае - это поле Answers) и ей надо помогать методом Include у таблицы вопросов. Это поле не инициализируется с целью экономии ресурсов. При первом запуске поле не равно null и из-за того, что EF "закешировал" данные.
1
06.10.2012, 23:23
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.10.2012, 23:23
Помогаю со студенческими работами здесь

Как создать окружающую среду для 3D игры
Вообщем, пишу игру на С++/SFML/OpenGL. Такой вопрос, как нарисовать окружающую среду? Не с помощью...

Как создать и работать с сервером для игры
Начал делать двухмерную игру на OpenGL, всё идёт отлично. Проблема в том что я не знаю как сделать...

Как правильно создать систему уведомлений для браузерной игры\сайта?
Всем привет! Недавно начал заниматься веб программированием, есть некие начальные знания в...

Создать список вопросов для выяснения функциональностей системы
Создать список вопросов для выяснения функциональностей системы


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru