使用通用存储库时,列名“ EmailAddress”无效,但可以与上下文一起正常使用

时间:2019-07-24 15:44:31

标签: asp.net-core entity-framework-core

在尝试对帐户执行GetAll时得到提到的错误。如果我直接进入dbcontext,它可以正常工作,但是如果我尝试使用存储库,则会出现错误。我大约有20个仅使用通用存储库,并且运行良好。因为我还有其他用于帐户的操作,所以我创建了自己的存储库,该存储库实现了泛型。我也有其他几个像这样工作,没有问题。该问题是特定于帐户的。

数据库当然具有EmailAddress列,因为如果我使用控制器中的dbcontext而不是存储库,则可以返回它。

任何帮助将不胜感激。

AccountsController:

public class AccountsController : ControllerBase
{
    private readonly AccountRepository _repo;

    public AccountsController(DatabaseContext context)
    {
        _repo = new AccountRepository(context);
    }

    [HttpGet]
    public async Task<ActionResult<IEnumerable<Account>>> GetAccount()
    {
        // return _context.Account.ToListAsync(); works fine if _context is defined
                    var accounts = await _repo.GetAll();
        if (accounts == null)
            return NoContent();

        return Ok(accounts); // Gives invalid column error
    }

    [HttpGet("getaccount")]
    public async Task<ActionResult<Account>> GetCurrentAccount()
    {
        var account = await _repo.GetCurrentAccount(HttpContext.User.Identity.Name);
        if (account == null)
        {
            return NotFound();
        }

        return account; // Works fine
    }
}

帐户:

public partial class Account
{
    public string Name { get; set; }
    public string RefId { get; set; }
    public string Position { get; set; }
    public bool IsActive { get; set; }
    public string EmailAddress { get; set; }

    [Key]
    public string UserId { get; set; }
}

IAccountRepository:

public interface IAccountRepository : IRepository<Account>
{
    Task<Account> GetCurrentAccount(string emailAddress);
}

AccountRepository:

public class AccountRepository : Repository<Account>, IAccountRepository
{
    private DatabaseContext _context;

    public AccountRepository(DatabaseContext context)
    {
        _context = context;
    }

    public async Task<Account> GetCurrentAccount(string emailAddress)
    {
        var account = await _context.Account
            .Where(a => a.EmailAddress == emailAddress)
            .FirstOrDefaultAsync();

        return account; // this works just fine, and returns with EmailAddress
    }
}

IRepository(通用):

public interface IRepository<T>
{
    Task<IEnumerable<T>> GetAll();
    Task<T> GetById(object id);
    void Add(T entity);
    void Update(T entity);
    void Delete(T entity);
    Task<bool> Save();
}

存储库(通用):

public class Repository<T> : IRepository<T> where T : class
{
    private DatabaseContext _context;

    public Repository()
    {
        _context = new DatabaseContext();
    }

    public Repository(DatabaseContext context)
    {
        _context = context;
    }

    public void Add(T obj)
    {
        _context.Set<T>().Add(obj);
    }

    public void Delete(T entity)
    {
        _context.Set<T>().Remove(entity);
    }

    public async Task<IEnumerable<T>> GetAll()
    {
        return await _context.Set<T>().ToListAsync();
    }

    public async Task<T> GetById(object id)
    {
        return await _context.Set<T>().FindAsync(id);
    }

    public void Update(T obj)
    {
        _context.Set<T>().Update(obj);
    }

    public async Task<bool> Save()
    {
        try
        {
            await _context.SaveChangesAsync();
        }
        catch (Exception)
        {
            return false;
        }
        return true;
    }
}

编辑 我要提到的是,电子邮件地址是通过EF迁移添加到数据库中的。

0 个答案:

没有答案