0

我正在尝试将用于许多 MVC 4 应用程序的 UnitOfWork 模式扩展到 MVC 5,同时还使用新的 IdentityDbContext 并且事情没有解决。问题是它很难调试,因为没有产生错误。

首先,一些代码。

我有一个如下所示的上下文定义。我已将自己的 DbSet 添加到开箱即用的 IdentityDbContext 中,因为将所有内容保存在一个地方是有意义的。

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public DbSet<PALSOfficer> PALSOfficers { get; set; }
    public DbSet<Client> Clients { get; set; }
    public DbSet<GP> GPs { get; set; }
    public DbSet<Surgery> Surgeries { get; set; }
    public DbSet<Disability> Disabilities { get; set; }
    public DbSet<Area> Areas { get; set; }
    public DbSet<PALSReferral> PALSReferrals { get; set; }
    public DbSet<Appointment> Appointments { get; set; }

    public ApplicationDbContext()
        : base("DefaultConnection")
    {
    }



}

然后我有一个 UnitOfWork 类,如下所示:

public class UnitOfWork : IDisposable
{
    private bool _disposed = false;
    private ApplicationDbContext _context = new ApplicationDbContext();
    public UserManager<ApplicationUser> _userManager { get; set; }

    private PalsOfficerRepository _palsOfficerRepository;
    private UserRepository _userRepository;
    private GenericRepository<Area> _areaRepository;

    public UserRepository UserRepository
    {
        get
        {
            if (this._userRepository == null)
            {
                this._userRepository = new UserRepository(_context);
            }
            return _userRepository;
        }
    }

    public PalsOfficerRepository PalsOfficerRepository
    {
        get
        {
            if (this._palsOfficerRepository == null)
            {
                this._palsOfficerRepository = new PalsOfficerRepository(_context);
            }
            return _palsOfficerRepository;
        }
    }

    public GenericRepository<Area> AreaRepository
    {
        get
        {
            if (this._areaRepository == null)
            {
                this._areaRepository = new GenericRepository<Area>(_context);
            }
            return _areaRepository;
        }
    }

    public UserManager<ApplicationUser> UserManager
    {
        get
        {
            if (this._userManager == null)
            {
                this._userManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(_context));
            }
            return _userManager;
        }
    }



    public void Save()
    {
        try
        {
            _context.SaveChanges();
        }
        catch (DbEntityValidationException dbEx)
        {
            foreach (var validationErrors in dbEx.EntityValidationErrors)
            {
                foreach (var validationError in validationErrors.ValidationErrors)
                {
                    Trace.TraceInformation("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage);
                }
            }
            throw;
        }
    }

    protected virtual void Dispose(bool disposing)
    {
        if (disposing)
        {
            if (this._userManager != null)
            { this._userManager.Dispose(); }
            _userManager.Dispose();
        }
        this._disposed = true;
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }
}

到目前为止,一切都很好。我首先使用代码通过自动迁移生成我的数据库。

我的问题是,如果我尝试查询数据库,就会发生奇怪的事情。以这种方法为例。

var results = new SearchResults<PALSOfficer>();

        var officers = from o in Context.PALSOfficers
                       select o;

        if (!string.IsNullOrEmpty(keyword))
        {
            officers = (from o in officers
                        where o.FirstName.Contains(keyword) || o.LastName.Contains(keyword)
                        select o);

        }

        officers = officers.OrderBy(p => p.LastName);
        results.Total = officers.Count();
        int offset = page * display;
        results.ResultList = results.Total > offset ? officers.Skip(offset).Take(display) : officers;

        //results.ResultList = Context.PALSOfficers;

        return results;

即使数据库包含数据,这也不会返回任何内容。奇怪的是,计数会起作用。如果我在结果中放置一个断点并将鼠标悬停在结果上,我会收到“无法评估儿童”的消息

如果我只是返回Context.PALSOfficers,我会返回行。但是,对该数据的任何类型的操作(排序等)似乎都会完全破坏查询。

这是 PALSOfficer 的定义

public class ApplicationUser : IdentityUser
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
    public DateTime Added { get; set; }
    public DateTime Updated { get; set; }
}

public class PALSOfficer : ApplicationUser
{
    public string InternalReference { get; set; }
    public virtual ICollection<Area> Areas { get; set; }
}
4

0 回答 0