0 / 0 / 0
Регистрация: 25.02.2015
Сообщений: 45
1

Сохранение в БД объекта связанного с другими объектами

06.01.2019, 20:46. Показов 1324. Ответов 6

Author24 — интернет-сервис помощи студентам
Класс Game
C#
1
2
3
4
 public class Game
    {
        public int GameId { get; set; }
        public User XUser { get; set; } = new User();
Класс User
C#
1
2
3
4
5
public class User
    {
        public int UserId { get; set; }
        public string UserName { get; set; } = "Computer";
    }
Есть страница Game/Index, на которой отображается инфо + есть кнопка добавить новую игру
C#
1
2
3
4
5
@foreach (var item in Model.Game) {
        <tr>
            <td>@item.XUser.UserName</td>
        </tr>
}
Естественно в колонке отображается имя "Computer", но хочу при создании нового объекта, чтобы имя перезначалось.
Вот код контролера страницы "создать", но он не работает или работает не так, я пока только начал изучение
C#
1
2
3
4
5
6
7
8
9
10
11
 public async Task<IActionResult> OnPostAsync()
        {
            if (!ModelState.IsValid)
            {
                return Page();
            }
            Game.XUser.UserName = "xxx";  // эту строчку я добавил, но результат она не меняет
            _context.Games.Add(Game);
            await _context.SaveChangesAsync();
            return RedirectToPage("./Index");
        }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.01.2019, 20:46
Ответы с готовыми решениями:

Взаимодействие CharacterController с другими объектами
Всем игроделам привет! Интересует вопрос: на персонаже висит CharacterController и всё движение...

Реализация столкновения игрового персонажа с другими объектами
Есть игровой персонаж. Есть локация, на которой случайно разбросаны, к примеру, яблоки (вероятность...

Обновление связанного объекта в колонтитуле
А вот не подскажет ли кто, каким кодом можно заставить Word обновить связанный точечный рисунок в...

Получение объекта, связанного с узлом TreeNode
Имеется дерево (TTreeView). Добавляю в него первый узел, и привязываю к нему указатель на объект...

6
C# .NET Программист
34 / 22 / 5
Регистрация: 11.11.2016
Сообщений: 426
08.01.2019, 08:26 2
demcy, во-первых, внеси изменения:
C#
1
2
3
4
5
 public class Game
    {
        public int UserId { get; set; } //Вместо GameId
        public User User { get; set; } = new User(); //Можно просто "User"
    }
C#
1
2
3
4
5
6
    public class User
    {
        public int GameId { get; set; } //Вместо UserId
        public Game Game { get; set; }
        public string UserName { get; set; } = "Computer";
    }
Во-вторых, тебе нужно создать инициализировать класс пользователя и присвоить его к игре.
То есть, не так:
C#
1
Game.XUser.UserName = "xxx";
Ты присваиваешь пустой объект.

А так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[HttpGet]
public IActionResult SetGame(){
     Game game = new Game();
     return View(game);
}
[HttpPost]
public async Task<IActionResult> SetGame(Game game)
        {
            if (!ModelState.IsValid)
            {
                return View(game);
            }
            Game game = new Game { UserName = "xxx" }
            _context.Games.Add(game);
            await _context.SaveChangesAsync();
            return RedirectToPage("./Index");
        }
1
Администратор
Эксперт .NET
16989 / 13348 / 5209
Регистрация: 17.03.2014
Сообщений: 27,295
Записей в блоге: 1
08.01.2019, 16:53 3
Ислам2001, замена Game.GameId на Game.UserId и User.UserId на User.GameId это неверный шаг. Это были первичные ключи без которых EF не будет работать.

demcy, поясни свою задачу. Сейчас у тебя есть класс игра с ссылающийся на пользователя. То есть в одну игру может играть только один пользователь. Так и задумывалось?
1
C# .NET Программист
34 / 22 / 5
Регистрация: 11.11.2016
Сообщений: 426
08.01.2019, 20:21 4
Цитата Сообщение от OwenGlendower Посмотреть сообщение
замена Game.GameId на Game.UserId и User.UserId на User.GameId это неверный шаг
Черт, сорри Я думал, это внешние ключи и он их "местами перепутал". (Первичные ключи записываю без префикса).
Но опять-таки, по его словам, в классе Game есть User. Значить внешний ключ для него все-таки нужен. И в класс Game нужно добавить UserId. Ошибка в том, что он записывает в бд не инициализированный объект.

Только я теперь немного запутался, а что именно он хочет сделать?

Вот изменения (как я понял):
C#
1
2
3
4
5
6
public class Game
    {
        public int Id { get; set; }
        public int UserId { get; set; }
        public User User { get; set; } = new User();
    }
C#
1
2
3
4
5
6
7
8
9
10
public class User
    {
        public in Id { get; set; }
        public string UserName { get; set; } = "Computer";
 
        public ICollection<Game> Games { get; set; }
        public User() {
            Games = new List<Game>();
        }
    }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[HttpGet]
public IActionResult SetGame(){
     Game game = new Game();
     return View(game);
}
[HttpPost]
public async Task<IActionResult> SetGame(Game game)
        {
            if (!ModelState.IsValid)
            {
                return View(game);
            }
     
            User user = _context.Users.FirstOrDefault(u => u.UserName == "xxx");
 
            Game game = new Game { UserId = user.Id }
            _context.Games.Add(game);
 
            await _context.SaveChangesAsync();
            return RedirectToPage("./Index");
        }
В том коде допустил ошибку. Не инициализировал пользователя.
1
Администратор
Эксперт .NET
16989 / 13348 / 5209
Регистрация: 17.03.2014
Сообщений: 27,295
Записей в блоге: 1
08.01.2019, 20:38 5
Цитата Сообщение от Ислам2001 Посмотреть сообщение
Но опять-таки, по его словам, в классе Game есть User. Значить внешний ключ для него все-таки нужен. И в класс Game нужно добавить UserId.
Это необязательно делать. Внешний ключ все равно будет создан и связь будет работать.
1
C# .NET Программист
34 / 22 / 5
Регистрация: 11.11.2016
Сообщений: 426
08.01.2019, 20:39 6
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Это необязательно делать. Внешний ключ все равно будет создан и связь будет работать.
Не пробовал.
1
0 / 0 / 0
Регистрация: 25.02.2015
Сообщений: 45
09.01.2019, 14:06  [ТС] 7
Спасибо.
Игра однопользовательская. Но не суть, класс Юзер мог быть любым. В классе гейм действительно нужен UserId.
Тогда в БД добавляется одновременно объект.
C#
1
2
3
4
5
6
7
8
public class Game
    {
        public int GameId { get; set; }
        
 
        public int UserId { get; set; }
        public User User { get; set; } = new User();
    }
0
09.01.2019, 14:06
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.01.2019, 14:06
Помогаю со студенческими работами здесь

Как получить значение связанного объекта в combobox?
Добрый день, подскажите как получить значение связанного объекта в combobox? ...

Сохранение таблицы StringGrid вместе с объектами
Доброго времени суток. Есть StringGrid с закрашенными ячейками. Как сохранить таблицу вместе с...

Сохранение массива в памяти и дальнейшее его использование другими скриптами
Здравствуйте! Я не знаю как правильно это назвать. задача такая: запускаю скрипт который берет с...

При определённом угле поворота поверх рисуются невидимые (закрытые другими) части объекта
из известных недостатков своей программы точно знаю один - координаты z не в диапазоне (0;1), но...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

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