ASP.Net MVC 3 - unitOfWork.Commit () ничего не сохраняет - PullRequest
1 голос
/ 02 сентября 2011

Я создал веб-приложение, используя ASP.Net MVC 3 и EF 4.1, и я использую шаблон UnitOfWork, но ничего не фиксируется в базе данных. Все это довольно ново для меня, и я не знаю, с чего начать, чтобы решить эту проблему.

Я опирался на этот пост, чтобы создать свое веб-приложение:

http://weblogs.asp.net/shijuvarghese/archive/2011/01/06/developing-web-apps-using-asp-net-mvc-3-razor-and-ef-code-first-part-1.aspx

Окончательный код, который можно получить здесь также имеет сервисный уровень, и UnitOfWOrk внедряется в сервисы.

Вместо использования собственного инжектора на основе Unity 2, как в этом проекте, я использую Unity.Mvc3.

Вот мой класс IUnitOfWork:

public interface IUnitOfWork
{
    void Commit();
}

А вот мой класс UnitOfWork:

public class UnitOfWork : IUnitOfWork
{
    private readonly IDatabaseFactory databaseFactory;
    private MyProjectContext dataContext;

    public UnitOfWork(IDatabaseFactory databaseFactory)
    {
        this.databaseFactory = databaseFactory;
    }

    protected MyProjectContext DataContext
    {
        get { return dataContext ?? (dataContext = databaseFactory.Get()); }
    }

    public void Commit()
    {
        DataContext.Commit();
    }
}

А вот как выглядит один из моих классов обслуживания:

public class RegionService : IRegionService
{
    private readonly IRegionRepository regionRepository;
    private readonly IUnitOfWork unitOfWork;
    public RegionService(IRegionRepository regionRepository, IUnitOfWork unitOfWork)
    {
        this.regionRepository = regionRepository;
        this.unitOfWork = unitOfWork;
    }  
    ...
}

При запуске мой компонент UnitOfWork регистрируется так:

container.RegisterType<IUnitOfWork, UnitOfWork>();

Теперь, независимо от того, пытаюсь ли я вставить, обновить или удалить, запрос в базу данных не отправляется. Что мне здесь не хватает?

UPDATE

Вот содержимое DataContext.Commit ():

public class MyProjectContext : DbContext
{
     public DbSet<Region> Regions { get; set; }

    public virtual void Commit()
    {
        base.SaveChanges();
    }
}

А вот и база данныхFactory.Get ():

public interface IDatabaseFactory : IDisposable
{
    MyProjectContext Get();
}

ОБНОВЛЕНИЕ № 2:

Используя отладчик, я замечаю, что мои сервисы Region и конструкторы контроллера вызываются один раз при выполнении только выбора, но они вызываются дважды при обновлении. Это нормально?

Ответы [ 3 ]

4 голосов
/ 02 сентября 2011

Хорошо, я нашел виновника. Это связано с тем, как я регистрировал свою фабрику баз данных.

Вместо

container.RegisterType<IDatabaseFactory, DatabaseFactory>();

Мне нужно

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

Я нашел информацию на этом сайте:

http://www.devtrends.co.uk/blog/introducing-the-unity.mvc3-nuget-package-to-reconcile-mvc3-unity-and-idisposable

0 голосов
/ 02 сентября 2011

Может быть просто опечатка, но в UnitOfWork ваш личный MyProjectContext называется dataContext (строчная d)

Но в вашем методе commit вы вызываете DataContext.Commit.Есть ли шанс, что на самом деле вызывается статический метод, который вы не собирались вызывать?Скорее опечатка, но думал, что я укажу на это.

+ 1 для слишком сложной реализации UnitOfWork.

0 голосов
/ 02 сентября 2011

Это очень сложная реализация единицы работы. Я на самом деле предпочитаю это:

http://azurecoding.net/blogs/brownie/archive/2010/09/22/irepository-lt-t-gt-and-iunitofwork.aspx

Гораздо проще и гораздо гибче. Хотя вы должны решить несколько вещей для себя.

...