控制器post动作结果没有保存更改到数据库



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

fixedAssetService.SaveFixedAsset() 

并在服务接口中添加以下内容:

unitOfWork.Commit()

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

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

我的post方法:

[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
    }
}

Edit:我忘记提到的一件事是,这个应用程序几乎完全是在现有的应用程序之后建模的。不确定我是否有引用混乱或什么,但其他应用程序使用相同的方法,只有不同的实体

我找到我的问题了。在这个应用中,我使用了一个单独的unity类作为模型。我的数据库工厂注册是这样的:

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

现在我用的是Microsoft.Practices.Unity和Unity。所以我把注册改成:

container.RegisterType<IDatabaseFactory, DatabaseFactory>();

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

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

根据这篇文章的建议:

Stackoverflow线程

终于成功了!

相关内容

  • 没有找到相关文章

最新更新