Modyfikacja bazy danych

0

Cześć. Mam pytanie dlaczego reputacja posta i usera się nie zmiania w db.Napisalem cos podobnego w asp net core i działało. Baza danych normalnie sie modyfikowała zmieniała wartość reputacji posta i usera?

        public void AddRatingPost(string userId, int postId)
        {
            var item = db.Ratings.SingleOrDefault(x => x.UserId == userId && x.PostId == postId);
            var postUserId = postService.GetPostById(postId).UserId;

            Rating rating = new Rating
            {
                UserId = userId,
                PostId = postId
            };
            if (item == null)
            {
                var user = userService.GetUserById(postUserId).Reputation++;
                var post = postService.GetPostById(postId).Reputation++;
                db.Ratings.Add(rating);
                
            }
            else
            {
                var user = userService.GetUserById(postUserId).Reputation--;
                var post = postService.GetPostById(postId).Reputation--;
                db.Ratings.Remove(item);
                
            }

            db.SaveChanges();
        }
1

Tak wstępnie to w w tych ifach nie pobieraj obiektów tylko zmieniaj wartości. Pobieraj obiekty przed ifami.

0
        public void AddRatingPost(string userId, int postId)
        {
            var item = db.Ratings.SingleOrDefault(x => x.UserId == userId && x.PostId == postId);
            var postUserId = postService.GetPostById(postId).UserId;
            var user = userService.GetUserById(postUserId);
            var post = postService.GetPostById(postId);

            Rating rating = new Rating
            {
                UserId = userId,
                PostId = postId
            };
            if (item == null)
            {
                user.Reputation++;
                post.Reputation++;
                db.Ratings.Add(rating);
                
            }
            else
            {
                user.Reputation--;
                post.Reputation--;
                db.Ratings.Remove(item);
                
            }

            db.SaveChanges();
        }

Poprawione dzięki. Tylko ten problem nie czaje czemu nie zmieniaja się wartości :(

1

Jest kwestią tego czy db w metodzie jest tą samą instancją co w serwisach?

0
    public class UserService : IUserService
    {
        private ApplicationDbContext db;

        public UserService(ApplicationDbContext _db)
        {
            db = _db;
        }
        public ApplicationUser GetUserById(string userId)
        {
           var item =  db.Users.SingleOrDefault(x => x.Id == userId);
           return item;
        }
    }

Ona się tutaj różnią ?

1

Chodzi o to, że AddRatingPost korzysta z Dbcontextu oraz Serwisy też. I Teraz jest kwestią czy z tej samej instancji?. W sensie jak ten DbContext rejestrujesz?. Może dodaj metody do serwisów IncreaseRating DecreaseRating i tam rób savechanges

1

chodzi o to

var db1=new DbContext();
var db2=new DbContext();

db1 i db2 to są różne instacje. Jak w jednym coś pobierzesz a w drugim zrobisz savechanges to zmiany na bazie nie zadziałają

I jeśli robisz wstrzykiwanie zależności i za każdym razem wstrzykujesz nową instancje to twój kod nie zadziała poprawnie

0

Dziękuje za wyjaśnienie :)
Napisałem coś takiego w post serwis, działa ale co o tym sądzisz kod jest poprawny ?

        public void AddRatingPost(string userId, int postId)
        {
            var grade = db.Ratings.SingleOrDefault(x => x.PostId == postId && x.UserId == userId);
            var userPostId = GetPostById(postId).UserId;
            var user = db.Users.SingleOrDefault(x => x.Id == userPostId);
            var post = GetPostById(postId);
            Rating rating = new Rating
            {
                UserId = userId,
                PostId = postId
            };
            if (grade == null)
            {
                user.Reputation++;
                post.Reputation++;
                db.Entry(user).State = System.Data.Entity.EntityState.Modified;
                db.Ratings.Add(rating);

            }
            else
            {
                user.Reputation--;
                db.Entry(user).State = System.Data.Entity.EntityState.Modified;
                post.Reputation--;
                db.Ratings.Remove(grade);
            }
            db.SaveChanges();
        }
1

Zmieniłeś sposób pobrania usera oraz posta. Więc powinno działać bez tych linii

db.Entry(user).State = System.Data.Entity.EntityState.Modified;
db.Entry(user).State = System.Data.Entity.EntityState.Modified;

Bo Context śledzi obiekty, których zmieniasz wartości.

1 użytkowników online, w tym zalogowanych: 0, gości: 1