Http-Post редактирует действие, вызывающее ISession.SaveOrUpdate (obj) создает новую сущность - PullRequest
0 голосов
/ 13 августа 2011

Я создаю приложение Asp.Net MVC 3 с NHibernate в качестве моего ORM.В моем методе действия редактирования я вызываю метод Save в моем классе DatabaseAccessObject, но вместо обновления объекта он создает новый.Я не могу понять, почему.

Вот код для метода, который возвращает мой настроенный SessionFactory, и мой файл global.asax.cs, в котором я храню SessionFactory:

public static ISessionFactory CreateSessionFactory()
        {
            return Fluently.Configure()
                .Database(MsSqlConfiguration.MsSql2008.ConnectionString("Server=(local);Database=WebApplicationPbiBoard;Trusted_Connection=True;"))
                .Mappings(m => m.FluentMappings.AddFromAssemblyOf<WebApplicationPbiBoard.Models.ScrumModels_Mappings.PbiMap>())
                .ExposeConfiguration(cfg => new SchemaUpdate(cfg).Execute(false, true))
                .CurrentSessionContext("web")
                .BuildSessionFactory();
        }

public class MvcApplication : System.Web.HttpApplication
{
    public static ISessionFactory SessionFactory { get; private set; }
    protected void Application_Start()
    {
        //my additions
        SessionFactory = NHibernateConfigurator.CreateSessionFactory();
    }

    protected void Application_OnEnd()
    {
        SessionFactory.Dispose();
    }

    protected void Application_BeginRequest()
    {
        ISession session = SessionFactory.OpenSession();

        CurrentSessionContext.Bind(session);
    }

    protected void Application_EndRequest()
    {
        CurrentSessionContext.Unbind(SessionFactory);
    }
}

Вот соответствующий фрагмент из моего DataAccessObject, который просто оборачивает операции CRD NHibernate:

public class DatabaseAccessObject<T> where T : class
    {
        private readonly ISession session = MvcApplication.SessionFactory.GetCurrentSession();
        private ISession Session { get { return session; } }

        public T Save(T obj)
        {
            ITransaction transaction = null;
            try
            {
                transaction = Session.BeginTransaction();

                Session.SaveOrUpdate(obj);
                transaction.Commit();
                return obj;
            }
            catch (Exception ex)
            {
                if (transaction != null && transaction.IsActive)
                    transaction.Rollback();

                throw;
            }
        }

И, наконец, вот код для моего метода редактирования Http-Post:

private readonly DatabaseAccessObject<Sprint> db = new DatabaseAccessObject<Sprint>();
private DatabaseAccessObject<Sprint> Db { get { return db; } }

[HttpPost]
public ActionResult Edit(Sprint editedSprint)
{
    if (ModelState.IsValid)
    {
        Db.Save(editedSprint);
        return RedirectToAction("Index");
    }
    else
        return View(editedSprint);            
 }

Любая помощь будет оценена.

1 Ответ

2 голосов
/ 14 августа 2011

Скорее всего, сохраняемый объект не имеет идентификатора.

SaveOrUpdate выполняет одно из двух: - Обновить (), если Id установлен. - Сохранить (), если идентификатор не установлен.

см. Документы: http://www.nhforge.org/doc/nh/en/index.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...