controller post actionresult不保存对数据库的更改

时间:2014-08-20 16:17:34

标签: asp.net-mvc viewmodel savechanges

我的控制器中有一个post方法,它不保存对我的数据库的更改(SQL express)。我正在使用viewmodels和valueinjector从我的模型中填充VM。我已经检查过viewmodel中的值并且它们已经改变了,但是当我调用我的服务时:

fixedAssetService.SaveFixedAsset() 

并在服务界面中为以下内容添加书签:

unitOfWork.Commit()

并拉出unitOfWork的快速监视窗口,它具有旧值。

我的所有表都有主键,我首先使用代码。连接字符串是有效的,因为我可以获取项目,我只是无法保存它们。

我的帖子方法:

[HttpPost]
[ValidateAntiForgeryToken]

public ActionResult Edit(FixedAssetViewModel evm)
{
    var fixedAsset = fixedAssetService.GetFixedAsset(evm.FixedAssetId);
    // Use Injector to handle mapping between viewmodel and model
    fixedAsset.InjectFrom(evm);

    try
    {
        if (ModelState.IsValid)
        {
            fixedAssetService.SaveFixedAsset();
            return RedirectToAction("Details", "FixedAsset", new { id = fixedAsset.FixedAssetId });
        }
    }
    catch (DataException)
    {
        //Log the error (add a variable name after DataException)
        ModelState.AddModelError("", "Unable to save changes. Try again, and if the problem persists, see your system administrator.");
    }
}

我的服务:

namespace FixedAssets.Services
{
    public interface IFixedAssetService
    {
        IEnumerable<FixedAsset> GetAll();
        IEnumerable<FixedAsset> FindBy(Expression<Func<FixedAsset, bool>> predicate);
        FixedAsset GetFixedAsset(string id);
        void CreateFixedAsset(FixedAsset fixedAsset);
        void DeleteFixedAsset(string id);
        void SaveFixedAsset();
        bool ValueInUse(Expression<Func<FixedAsset, bool>> predicate);
    }
    public class FixedAssetService : IFixedAssetService
    {
        private readonly IFixedAssetRepository fixedAssetRepository;
        private readonly IUnitOfWork unitOfWork;
        public FixedAssetService(IFixedAssetRepository fixedAssetRepository, IUnitOfWork unitOfWork)
        {
            this.fixedAssetRepository = fixedAssetRepository;
            this.unitOfWork = unitOfWork;
        }
        #region IFixedAssetService Members

        public IEnumerable<FixedAsset> GetAll()
        {
            var fixedAssets = fixedAssetRepository.GetAll();
            return fixedAssets;
        }

        public IEnumerable<FixedAsset> FindBy(Expression<Func<FixedAsset, bool>> predicate)
        {
            IEnumerable<FixedAsset> query = fixedAssetRepository.FindBy(predicate);
            return query;
        }

        public bool ValueInUse(Expression<Func<FixedAsset, bool>> predicate)
        {
            IQueryable<FixedAsset> query = fixedAssetRepository.FindBy(predicate).AsQueryable();
            int count = query.Count();
            return count > 0 ? true : false;
        }

        public FixedAsset GetFixedAsset(string id)
        {
            var fixedAsset = fixedAssetRepository.GetById(id);
            return fixedAsset;
        }

        public void CreateFixedAsset(FixedAsset fixedAsset)
        {
            fixedAssetRepository.Add(fixedAsset);
            SaveFixedAsset();
        }

        public void DeleteFixedAsset(string id)
        {
            var fixedAsset = fixedAssetRepository.GetById(id);
            fixedAssetRepository.Delete(fixedAsset);
            SaveFixedAsset();
        }

        public void SaveFixedAsset()
        {
            unitOfWork.Commit();
        }

        #endregion
    }
}

编辑:有一件事我忘了提到这个应用程序几乎完全是在现有的应用程序运行良好之后建模的。不确定我是否有引用乱搞或什么,但另一个应用程序使用相同的方法只有不同的实体

1 个答案:

答案 0 :(得分:0)

我发现了我的问题。在我用作这个模型的应用程序中,我使用了一个单独的统一类。我的数据库工厂注册是这样的:

.RegisterType<IDatabaseFactory, DatabaseFactory>(new HttpContextLifetimeManager<IDatabaseFactory>())

现在我正在使用Microsoft.Practices.Unity和Unity.Mvc4,所以我将注册更改为:

container.RegisterType<IDatabaseFactory, DatabaseFactory>();

根据bootstrapper类中的注释。当我把它改为:

container.RegisterType<IDatabaseFactory, DatabaseFactory>(new HierarchicalLifetimeManager());

根据这篇文章的建议:

Stackoverflow thread

它终于奏效了!