Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: ASP.NET MVC
Войти
Регистрация
Восстановить пароль
 
Plesen
0 / 0 / 0
Регистрация: 06.01.2016
Сообщений: 2
1

Баг при создании новой записи в БД используя Entity framework

22.07.2017, 15:49. Просмотров 451. Ответов 3

Есть у меня сайт, написанный под ASP .NET MVC 5 и с использованием Entity Framework 6.0 для обращения к базе данных. В этом сайте пользователь должен иметь возможность оставить свой пост, который после должен будет записаться в БД. Пользователь в данном случае - отдельная модель и связан с постом как один ко многим. Проблема заключается в том, что каждый раз, когда я произвожу запись нового поста в БД, производится запись нового пользователя с такими же значениями, как и отправитель поста, но с новым 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
public class HomeController : Controller
    {
        private static PostRepository _postRepository;
        private static CommentRepository _commentRepository;
        private static UsersRepository _userRepisitory;
 
        private int pageSize = 10;
 
        static HomeController()
        {
            _postRepository = new PostRepository();
            _commentRepository = new CommentRepository();
            _userRepisitory = new UsersRepository();
        }
 
        [HttpPost]
        [Authorize]
        public ActionResult AddPost()
        {
            Post post = new Post();
            post.Autor = _userRepisitory.GetByNickName(User.Identity.Name);
            post.Content = Request.Form["Content"];
            _postRepository.Put(post);
            return Redirect("Index");
        }
}

Код UserRepository.GetByNickName() :
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class UsersRepository
{
    public ApplicationUser GetByNickName(string nickname)
        {
            ApplicationUser user = null;
 
            using (BlogContext<ApplicationUser> context = new BlogContext<ApplicationUser>())
            {
                user = context.dbSet.FirstOrDefault<ApplicationUser>(x => x.NickName == nickname);
            }
 
            GetUserContent(ref user);
            return user;
        }
}
Код PostRepository.Put(Post post):

C#
1
2
3
4
5
6
7
8
9
10
11
public class PostRepository
{
        public void Put(Post item)
        {
            using (BlogContext<Post> context = new BlogContext<Post>())
            {
                context.dbSet.Add(item);
                context.SaveChanges();
            }
        }
}
Код BlogContext:

C#
1
2
3
4
5
6
7
8
9
    public class BlogContext<T> :DbContext where T: class
    {
        public DbSet<T> dbSet { get; set; }
 
        public BlogContext() : base("DefaultConnection")
        {
            
        }
    }
Код модели Post:

C#
1
2
3
4
5
6
7
8
9
10
11
public class Post : BaseModel
    {
        public virtual ApplicationUser Autor { get; set; }
        public string Content { get; set; }
        public ICollection<Comment> Comments { get; set; } //коментарии временно не используются
 
        public Post()
        {
            Comments = new List<Comment>();
        }
    }
Код модели ApplicationUser
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class ApplicationUser : BaseModel
    {
        public UserRole Role { get; set; }
        public string Login { get; set; }
        public string Password { get; set; }
        public string NickName { get; set; }
        public ICollection<Post> Posts { get; set; }
        public ICollection<Comment> Comments { get; set; }
 
        public ApplicationUser()
        {
            Posts = new List<Post>();
            Comments = new List<Comment>();
        }
    }
ну и Код BaseModel на всякий случай:
C#
1
2
3
4
 public class BaseModel
    {
        public int Id { get; set; }
    }
Тут указан не весь код сайта, тут указано то, что было выявленно пошаговым дебагом, как исполняющееся в момент проявления бага.
Как можно проследить из кода - нигде не вызывается запись нового пользователя, но в бд он появляется и я ума не приложу почему. Помогите пожалуйста, уважаемые форумчане.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.07.2017, 15:49
Ответы с готовыми решениями:

Вылетает Entity Framework при создании модели
Решил воспользоваться благами автоматического создания моделей из готовой бд и поставил Entity...

Entity Framework. Ошибки при создании EntityModel из базы данных
Народ. Вот есть база данных Всё вроде нормально в ней составлено, но при создании модели данных...

Entity Framework: сбой кодировки при создании базы данных
Всем доброго дня! Происходит следующая ситуация. Разрабатываю систему на одном компе, SQL...

SQLite и Entity Framework. Ошибка при создании базы данных по EDMX модели
Ошибка при создании базы данных по EDMX модели.

Событие при создании новой записи
Как называется событие, которое вызывается при создании новой записи?

3
IamRain
1540 / 1292 / 406
Регистрация: 02.08.2011
Сообщений: 3,815
22.07.2017, 19:35 2
Цитата Сообщение от Plesen Посмотреть сообщение
производится запись нового пользователя с такими же значениями
При добавлении нового поста нужно обязательно указывать PK пользователя, для которого добавляется пост. И не Navigation Property, а обязательно внешний ключ в модели Post, который ссылается на PK пользователя. Поскольку у вас в модели Post его нету, то при генерировании базы в таблице Post-ов он будет создан автоматически.
Вот так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Post : BaseModel
    {
        public virtual ApplicationUser Autor { get; set; }
        public string Content { get; set; }
 
        public ICollection<Comment> Comments { get; set; } //коментарии временно не используются
        
        [ForeignKey("Autor")]
        public int IdAuthor {get;set;}
        public Post()
        {
            Comments = new List<Comment>();
        }
    }
И вот так делать добавление:
C#
1
2
3
4
5
6
7
8
9
10
11
12
[HttpPost]
        [Authorize]
        public ActionResult AddPost()
        {
            Post post = new Post();
           // насколько я помню, в ASP Identity можно получить Id текущего пользователя без запроса в БД, это вы пошукайте сами
            var author =  _userRepisitory.GetByNickName(User.Identity.Name);
            post.IdAuthor = author.Id;
            post.Content = Request.Form["Content"];
            _postRepository.Put(post);
            return Redirect("Index");
        }
Без указания внешних ключей в моделях EF вы не сможете обойти эту проблему, насколько я знаю.
Как говорится, это не баг - это фича.
Btw, как-то добавлять контент через Request.Form[""] не айс. Вы PHP кодер? Надо работать всегда с моделями, для чего тогда придумали строгую типизацию?
0
Plesen
0 / 0 / 0
Регистрация: 06.01.2016
Сообщений: 2
22.07.2017, 22:32  [ТС] 3
Цитата Сообщение от IamRain Посмотреть сообщение
C#
1
2
// насколько я помню, в ASP Identity можно получить Id текущего пользователя без запроса в БД, это вы пошукайте сами
var author =  _userRepisitory.GetByNickName(User.Identity.Name);
Цитата Сообщение от IamRain Посмотреть сообщение
Btw, как-то добавлять контент через Request.Form[""] не айс. Вы PHP кодер? Надо работать всегда с моделями, для чего тогда придумали строгую типизацию?
в первую очередь - спасибо за указание на плохие места моего кода. Нет я не PHP кодер, просто у меня мало опыта в разработке сайтов на ASP .NET MVC (по сути это мой первый сайт). Вынужден констатировать, что ваша подсказка не помогла решить проблему, которую удалось решить хорошими людьми и курением гуглов иностранных.

вот ссылочка на вопрос со стека и первый комментарий к ней помогает решить проблему
https://stackoverflow.com/questions/...nges-is-called

Спасибо за уделённое мне время.
0
IamRain
1540 / 1292 / 406
Регистрация: 02.08.2011
Сообщений: 3,815
23.07.2017, 08:47 4
Можно было еще внимательно прочитать второй комментарий к ответу - это то о чем я вам говорил.
0
23.07.2017, 08:47
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.07.2017, 08:47

Узнать `id` (auto_increment) при создании новой записи
Предположим, есть такая таблица: CREATE TABLE `name`( `id` INT(11) VARCHAR AUTO_INCREMENT,...

Как избавиться от ошибки при создании новой записи
В запросе часть полей ссылается на таблицу, а часть полей вычисляемые. Одно из полей таблицы (поле...

Автоматичесское заполнение поля при создании новой записи
Есть поле &quot;фото&quot;, в котором хранится название файла картинки, которую отображает форма. Я хочу,...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru