成功保存更改时,EF无法更新列

时间:2016-08-20 08:50:30

标签: c# asp.net asp.net-mvc entity-framework

我无法使用EF更新我的数据库(UpdateSpecified()方法不起作用)。我的Add()方法运行正常。

编辑:我观察到SaveChanges方法总是返回1,它让我感到困惑,因为我更新了3个表。

我发现了RepositoryFactory的{​​{1}}代码,它已更改:

enter image description here

我的代码:

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);
    }
}

1 个答案:

答案 0 :(得分: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;
                }
            }
        }

    }