EF не может обновить столбец при успешном сохранении

c# asp.net asp.net-mvc entity-framework

57 просмотра

1 ответ

Я не могу обновить свою базу данных с помощью EF ( UpdateSpecified()метод не работает). Мой Add()метод работает отлично.

Изменить: я наблюдал метод SaveChanges, он всегда возвращает 1, это меня смущает, потому что я обновил 3 таблицы.

Я обнаружил , что RepositoryFactory«S IQueryableкод, он изменился:

введите описание изображения здесь

Мой код:

public class GoodsModel
{
    private IRepositoryFactory _repositoryFactory;
    private IServiceFactory _serviceFactory;
    private IGoodsService _goodsService;
    private IGoodsTypeService _goodsTypeService;
    private IUsersService _userService;
    private IOrderService _orderService;

    private IOrdersRepository orderRepo;
    private IUsersRepository userRepo;
    private IGoodsRepository goodsRepo;

    public GoodsModel()
    {
        _repositoryFactory = new RepositoryFactory();
        _repositoryFactory.OpenSession();
        _serviceFactory = new ServiceFactory(_repositoryFactory);
        _goodsService = _serviceFactory.CreateGoodsService();
        _goodsTypeService = _serviceFactory.CreateGoodsTypeService();
        _userService = _serviceFactory.CreateUsersService();
        _orderService = _serviceFactory.CreateOrderService();

        userRepo = _repositoryFactory.CreateUsersRepository();
        orderRepo = _repositoryFactory.CreateOrdersRepository();
        goodsRepo = _repositoryFactory.CreateGoodsRepository();
        orderRepo = _repositoryFactory.CreateOrdersRepository();
    }   

    public bool BuyProduct(BuyProductDto model)
    {
        string name = HttpContext.Current.User.Identity.Name;

        // _repositoryFactory.OpenSession();

        using (_repositoryFactory)
        {
            var user = _userService.Filter(x => x.UserName == name).FirstOrDefault();
            var good = _goodsService.Filter(x => x.GoodNumber == model.GoodNumber).FirstOrDefault();

            //var userRepo = _repositoryFactory.CreateUsersRepository();
            //var goodRepo = _repositoryFactory.CreateGoodsRepository();

            Users u = new Users();
            Goods g = new Goods();

            try
            {
                //substract when buy product.
                int remainScore = user.UserScore - (int)good.GoodScore;

                if (remainScore < 0)
                {
                    return false;
                }

                u.UserId = user.UserId;
                u.UserScore = remainScore;

                userRepo.Attach(u);
                userRepo.UpdateSpecified(u);

                g.Id = good.Id;

                //same as above syntax
                g.GoodsQuantity = good.GoodsQuantity - 1;

                goodsRepo.Attach(g);
                goodsRepo.UpdateSpecified(g);

                //orderRepo = _repositoryFactory.CreateOrdersRepository();

                orderRepo.Add(new Orders
                {
                    GoodId = good.Id,
                    InsertTime = DateTime.Now,
                    Status = 0,
                    UserId = user.UserId,
                    OrderNo = DateTime.Now.ToString("yyyyMMddss"),
                    UpdateTime = DateTime.Now
                });

                _repositoryFactory.Commit();

            }
            catch (Exception ex)
            {
                _repositoryFactory.RollBack();
                return false;
            }
        }

        return true;
    }
}

Код фреймворка находится здесь:

 public void UpdateSpecified(T entity)
 {
        var type = entity.GetType();

        if (type.IsPrimitive || type == typeof(string))
        {
            var props = type.GetProperties();

            foreach (var prop in props)
            {
                string propValue = prop.GetValue(entity, null) != null ? prop.GetValue(entity, null).ToString() : string.Empty;

                if (!string.IsNullOrEmpty(propValue))
                {
                    DataContext.Entry<T>(entity).Property(prop.Name).IsModified = true;
                }
                else
                {
                    DataContext.Entry<T>(entity).Property(prop.Name).IsModified = false;
                }
            }
        }           
    }     

    public void Attach(T entity)
    {
        DataContext.Set<T>().Attach(entity);
    }
}

Код сущности, подобный этому, содержит атрибут навигации:

public class Users
{
    public  int UserId { get; set; }

    public string UserName { get; set; }
    public  string Password { get; set; }

    public DateTime InsertTime { get; set; }

    public ICollection<UsersUserGroup> UsersUserGroups { get; set; }

    public int UserScore { get; set; }
}
Автор: MapleStory Источник Размещён: 08.11.2019 11:05

Ответы (1)


0 плюса

дубовый .... я решил это, это глупый вопрос , я признаю; Правильный код:

    public void UpdateSpecified(T entity)
    {
        var props = entity.GetType().GetProperties();
        foreach (var prop in props)
        {
            if (prop.PropertyType.IsPrimitive || prop.PropertyType == typeof(string))
            {
                string propValue = prop.GetValue(entity, null) != null ? prop.GetValue(entity, null).ToString() : string.Empty;
                if (!string.IsNullOrEmpty(propValue))
                {
                    DataContext.Entry<T>(entity).Property(prop.Name).IsModified = true;
                }
                else
                {
                    DataContext.Entry<T>(entity).Property(prop.Name).IsModified = false;
                }
            }
        }

    }
Автор: MapleStory Размещён: 20.08.2016 09:53
Вопросы из категории :
32x32