c# - 在 Web API、 Entity Framework 中使用 n 层体系结构时,数据访问层中的上下文为空

标签 c# entity-framework asp.net-core-webapi dbcontext

我正在尝试创建一个 Web API。我在这里使用 Entity Framework ,代码优先的方法。

这是一个 n 层架构。意思是,我在一个解决方案中创建了多个项目,如下所示。

enter image description here

我有一个 Controller 方法,它是一个 get 方法。我会将 userid 作为参数传递。

[Route("api/[controller]")]
[ApiController]
public class BankController : ControllerBase
{
    private readonly IBankApplicationDAL _bankAPI;

    public BankController(IBankApplicationDAL bankAPI)
    {
        _bankAPI = bankAPI;
    }

    [HttpGet("{userId}")]
    public IActionResult GetAccountDetailsId(int userId)
    {
        try
        {
            var values = _bankAPI.GetAccountDetailsId(userId);
            return Ok(values);
        }
        catch
        {
            throw;
        }
    }
}

在DAL层,这是我的:

using BankApplicationAPI.Model;
using BankApplicationAPI.Data;
using System;
using System.Linq;

namespace BankApplicationAPI.DAL
{
    public class BankApplicationDAL : IBankApplicationDAL
    {
        DataContext context;

        public AccountDetails GetAccountDetailsId(int userId)
        {
            try
            {
                var values = context.AccountDetails.FirstOrDefault(x => x.UserId == userId); // context is null here.
                return values;
            }
            catch (Exception ex)
            {
                throw;
            }
        }
    }
}

这是我拥有的 DataContext:

namespace BankApplicationAPI.Data
{
    public class DataContext : DbContext
    {
        public DataContext(DbContextOptions<DataContext> options) : base(options) { }

        public DbSet<AccountDetails> AccountDetails { get; set; }
        public DbSet<TransactionDetails> TransactionDetails { get; set; }
    }
}

当我运行这个应用程序时,我得到一个异常,指出 DAL 方法中的上下文为空(我已放置注释的地方)。

如何为 DataContext 创建对象?有人能帮我一下吗?这很重要。非常感谢。

编辑

Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    var connection = @"Server=.\sqlexpress;Database=AppDB;Trusted_Connection=True;ConnectRetryCount=0";

    services.AddDbContext<DataContext>(x => x.UseSqlServer(connection));
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
    services.AddSingleton<IBankApplicationDAL, BankApplicationDAL>();
}

最佳答案

你应该使用这个改变:

 public class BankApplicationDAL : IBankApplicationDAL
 {
            DataContext _context;
            public BankApplicationDAL(DataContext context)
            {
                _context = context;
            }

            public AccountDetails GetAccountDetailsId(int userId)
            {
                try
                {
                    var values = context.AccountDetails.FirstOrDefault(x => x.UserId == userId); // context is null here.
                    return values;
                }
                catch (Exception ex)
                {
                    throw;
                }
            }
   }

关于c# - 在 Web API、 Entity Framework 中使用 n 层体系结构时,数据访问层中的上下文为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55683181/

相关文章:

c# - Dapper 使用存储过程将多行插入到两个表中

c# - 如何从.net core应用程序向服务总线主题发送消息

json - 带有 JSON 参数的 HttpPost 在 ASP.NET Core 3 中不起作用

c# - Dotnet6 摆脱 Main 方法 - 如何在 Dotnet 5 中更改以下内容?

c# - Entity Framework 代码优先异常 "Duplicate entry ' 0' for key ' PRIMARY'"

c# - 将 List<String> 编码为普通 String 并将其解码回来的最简单方法是什么?

c# - LINQ to Entities 根据客户端输入对表达式进行排序

c# - 如何在 EF4.3 代码优先中映射到复杂类型或从复杂类型映射?

c# - 无法从列表中获取值以便设置网格 header 值 c#

c# - 如何在 Fluent NHibernate 中删除 child