如何在类库项目中正确定义 DBContext?

2024-02-23

我正在使用实体框架 7 并创建了两个项目。一个项目是 ASP.NET 5 Web API 项目,另一个是类库项目(包),我想在其中存储所有数据访问层逻辑。这样我就可以将此包用于另一个报告项目,并且我可能提供的其他附加服务。

基本上,我在 Web api 项目的控制器中有一个简单的帖子,它调用我的数据库项目中的函数。当函数启动数据库时,它说数据库未定义,即使它在两个项目中都定义了。


ERROR

{"No database providers are configured. Configure a database provider by overriding OnConfiguring in your DbContext class or in the AddDbContext method when setting up services."}

CODE

数据库项目:InsertPerson

public int InsertPerson(tbl_Person person)
{
    using (var db = new AppContext())
    {
        try
        {
            db.tbl_Person.Add(person);
            db.SaveChanges();
            return person.PersonID;
        }

        catch
        {
            return 0;
        }
    }
}

配置文件

Web API 项目:Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    services.AddEntityFramework()
        .AddSqlServer()
        .AddDbContext<AppContext>(options =>
            options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]));

    services.AddIdentity<ApplicationUser, IdentityRole>()
        .AddEntityFrameworkStores<AppContext>();

    services.AddMvc();
}

Web API 项目:appsettings.json

{
  "Data": {
    "DefaultConnection": {
      "ConnectionString": "Server=localhost;Database=testDB;Trusted_Connection=True;MultipleActiveResultSets=true"
    }
  },
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Verbose",
      "System": "Information",
      "Microsoft": "Information"
    }
  }
}

Web API 项目:project.json

{
  "userSecretsId": "blah,
  "version": "1.0.0-rc1-final",
  "compilationOptions": {
    "emitEntryPoint": true
  },

  "dependencies": {
    "DataLibrary": "",
    "Microsoft.AspNet.Authentication.OAuthBearer": "1.0.0-beta7",
    "Microsoft.AspNet.Http.Abstractions": "1.0.0-rc1-final",
    "Microsoft.AspNet.Identity.EntityFramework": "3.0.0-rc1-final",
    "Microsoft.AspNet.IISPlatformHandler": "1.0.0-rc1-final",
    "Microsoft.AspNet.Mvc": "6.0.0-rc1-final",
    "Microsoft.AspNet.Server.Kestrel": "1.0.0-rc1-final",
    "Microsoft.AspNet.StaticFiles": "1.0.0-rc1-final",
    "Microsoft.Extensions.Configuration.FileProviderExtensions": "1.0.0-rc1-final",
    "Microsoft.Extensions.Configuration.Json": "1.0.0-rc1-final",
    "Microsoft.Extensions.Configuration.UserSecrets": "1.0.0-rc1-final",
    "Microsoft.Extensions.Logging": "1.0.0-rc1-final",
    "Microsoft.Extensions.Logging.Console": "1.0.0-rc1-final",
    "Microsoft.Extensions.Logging.Debug": "1.0.0-rc1-final",
    "Remotion.Linq": "2.0.1"
  },

  "commands": {
    "web": "Microsoft.AspNet.Server.Kestrel"
  },

  "frameworks": {
    "dnx451": { },
    "dnxcore50": { }
  },

  "exclude": [
    "wwwroot",
    "node_modules"
  ],
  "publishExclude": [
    "**.user",
    "**.vspscc"
  ]
}

数据库项目:Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    services.AddEntityFramework()
        .AddSqlServer()
        .AddDbContext<AppContext>(options =>
            options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]));

    services.AddIdentity<ApplicationUser, IdentityRole>()
        .AddEntityFrameworkStores<AppContext>();

    services.AddMvc();
}

数据库项目:appsettings.json

{
  "Data": {
    "DefaultConnection": {
      "ConnectionString": "Server=localhost;Database=testDB;Trusted_Connection=True;MultipleActiveResultSets=true"
    }
  },
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Verbose",
      "System": "Information",
      "Microsoft": "Information"
    }
  }
}

数据库项目:AppContext.cs

namespace DataLibrary
{
    public class AppContext : IdentityDbContext<ApplicationUser>
    {
        public DbSet<tbl_Person> tbl_Person { get; set; }

        public static AppContext Create()
        {
            return new AppContext();
        }

        protected override void OnModelCreating(ModelBuilder builder)
        {
            new tbl_PersonMap(builder.Entity<tbl_Person>());
            base.OnModelCreating(builder);
        }
    }
}

示例代码中的问题似乎是您正在更新 AppContext 实例,而不是从 ServiceProvider 解析它。当您以这种方式初始化 DbContext 时,会为上下文隐式创建一个新的 ServiceProvider,并且该上下文不会考虑 Startup.cs 中的任何配置。如果您在 OnConfiguring 中配置上下文并且对应用程序其余部分中的依赖项注入不感兴趣,则可以使用此模式。

在这种情况下,我希望您通过构造函数注入来获取 AppContext。对于这种解决方案,您还需要在 ServiceCollection 中注册数据访问层类。结果应该看起来更像这样:

数据库项目:AppContext.cs

namespace DataLibrary
{
    public class AppContext : IdentityDbContext<ApplicationUser>
    {
        public DbSet<tbl_Person> tbl_Person { get; set; }

        protected override void OnModelCreating(ModelBuilder builder)
        {
            new tbl_PersonMap(builder.Entity<tbl_Person>());
            base.OnModelCreating(builder);
        }
    }
}

数据库项目:PersonH​​elper.cs

namespace DataLibrary
{
    class PersonHelper
    {
        private readonly AppContext db;

        public PersonHelper(AppContext context)
        {
            db = context;
        }

        public int InsertPerson(tbl_Person person)
        {
            try
            {
                db.tbl_Person.Add(person);
                db.SaveChanges();
                return person.PersonID;
            }
            catch
            {
                return 0;
            }
        }
    }
}

Web API 项目:Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    services.AddEntityFramework()
        .AddSqlServer()
        .AddDbContext<AppContext>(options =>
            options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]));

    services.AddIdentity<ApplicationUser, IdentityRole>()
        .AddEntityFrameworkStores<AppContext>();

    services.AddScoped<PersonHelper>();

    services.AddMvc();
}

Web API 项目:MyController.cs

[Route("api/[controller]")]
public class MyController : Controller
{
    private readonly personHelper helper;

    public MyController(PersonHelper helper)
    {
        this.helper = helper;
    }

    // POST api/my
    [HttpPost]
    public void Post([FromBody]string value)
    {
        var person = new tbl_Person
        {
          // ...
        }

        return helper.InsertPerson(person);
    }
}

您甚至可以考虑在 IServiceCollection 上为数据访问层类添加扩展方法,以帮助减少配置中的重复,尤其是在添加更多常用服务时。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在类库项目中正确定义 DBContext? 的相关文章

  • Exit() 时是否调用基本对象析构函数?

    我意识到这个问题已经出现过几次 但我试图获得上述问题的明确答案 但我不断遇到相互矛盾的信息 我需要知道的是 当我使用 exit 时 基本类对象是否被破坏 我知道需要删除动态内存 但我的意思更像是 include
  • 如何在 VC++ CString 中验证有效的整数和浮点数

    有人可以告诉我一种有效的方法来验证 CString 对象中存在的数字是有效整数还是浮点数吗 Use tcstol http msdn microsoft com en us library w4z2wdyc aspx and tcstod
  • 在 HKCR 中创建新密钥有效,但不起作用

    我有以下代码 它返回 成功 但使用两种不同的工具使用搜索字符串 3BDAAC43 E734 11D5 93AF 00105A990292 搜索注册表不会产生任何结果 RegistryKey RK Registry ClassesRoot C
  • 实体框架中的分页

    在实体框架中 使用 LINQ to Entities 数据库分页通常按以下方式完成 int totalRecords EntityContext Context UserSet Count var list EntityContext Co
  • 如何将 SOLID 原则应用到现有项目中

    我对这个问题的主观性表示歉意 但我有点卡住了 我希望之前处理过这个问题的人能够提供一些指导和建议 我有 现在已经成为 一个用 C 2 0 编写的非常大的 RESTful API 项目 并且我的一些类已经变得巨大 我的主要 API 类就是一个
  • cpp.react库的C++源代码中奇怪的“->* []”表达式

    这是我在文档中找到的 C 片段cpp react 库 https github com schlangster cpp react implicit parallelism auto in D MakeVar 0 auto op1 in g
  • 不同 C++ 文件中的相同类名

    如果两个 C 文件具有相同名称的类的不同定义 那么当它们被编译和链接时 即使没有警告也会抛出一些东西 例如 a cc class Student public std string foo return A void foo a Stude
  • 什么是空终止字符串?

    它与什么不同标准 字符串 http www cplusplus com reference string string 字符串 实际上只是一个数组chars 空终止字符串是指其中包含空字符的字符串 0 标记字符串的结尾 不一定是数组的结尾
  • 在 C# 中检查 PowerShell 执行策略的最佳方法是什么?

    当你跑步时Get ExecutionPolicy在 PowerShell 中 它得到有效的执行政策 https learn microsoft com en us powershell module microsoft powershell
  • 在 VS 中运行时如何查看 C# 控制台程序的输出?

    我刚刚编写了一个名为 helloworld 的聪明程序 它是一个 C NET 4 5 控制台应用程序 在扭曲的嵌套逻辑迷宫深处 使用了 Console WriteLine 当我在命令行运行它时 它会运行并且我会看到输出 我可以执行其他命令并
  • 如何计算关联实体而不在实体框架中获取它们

    我想知道这个问题已经有一段时间了 所以我认为值得使用我的第一篇 Stack Overflow 帖子来询问它 想象一下我正在与关联的消息列表进行讨论 DiscussionCategory discussionCategory reposito
  • 已发布的 .Net Core 应用程序警告安装 .Net Core,但它已安装

    我制作了一个 WPF 和控制台应用程序 供某人在我无法访问的私人服务器上使用 我使用 Visual Studio 2019 的内置 发布向导 来创建依赖于框架的单文件应用程序 当该人打开 WPF 应用程序时 他们会看到标准警告 他们单击 是
  • 在 C# 中为父窗体中的子窗体控件添加事件处理程序

    我有两种形式 一种是带有按钮和文本框的父表单 单击该按钮时 将打开一个对话框 该子窗体又包含一个文本框和一个按钮 现在我想要的是 每当子表单文本框中的文本更改时 父表单文本框中的文本会自动更改 为了获得这个 我所做的是 Form3 f3 n
  • 在 C 中使用枚举而不是 #defines 作为编译时常量是否合理?

    在 C 工作了一段时间后 我将回到 C 开发领域 我已经意识到 在不必要的时候应该避免使用宏 以便让编译器在编译时为您做更多的工作 因此 对于常量值 在 C 中我将使用静态 const 变量或 C 11 枚举类来实现良好的作用域 在 C 中
  • memcpy/memmove 到联合成员,这是否设置“活动”成员?

    重要说明 一些评论者似乎认为我是从工会抄袭的 仔细看memcpy 它从普通旧地址复制uint32 t 它不包含在联合中 另外 我正在复制 通过memcpy 到工会的特定成员 u a16 or u x in a union 不直接到整个联盟本
  • 代码中的.net Access Forms身份验证“超时”值

    我正在向我的应用程序添加注销过期警报 并希望从我的代码访问我的 web config 表单身份验证 超时 值 我有什么办法可以做到这一点吗 我认为您可以从 FormsAuthentication 静态类方法中读取它 这比直接读取 web c
  • C++:二叉树所有节点值的总和

    我正在准备面试 我被一个二叉树问题困住了 我们如何计算二叉树所有节点中存在的值的总和 优雅的递归解决方案 伪代码 def sum node if node NULL return 0 return node gt value sum nod
  • EntityFramework 6.0.0.0 读取数据,但不插入

    我创建了一个基于服务的数据库 folderName gt Add New Item gt Data gt Service based Database文件到 WPF 应用程序中 然后我用过Database First方法并创建了Person
  • 为什么空循环使用如此多的处理器时间?

    如果我的代码中有一个空的 while 循环 例如 while true 它将把处理器的使用率提高到大约 25 但是 如果我执行以下操作 while true Sleep 1 它只会使用大约1 那么这是为什么呢 更新 感谢所有精彩的回复 但我
  • 我可以使用 lambda 函数或 std::function 对象来代替函数指针吗?

    我有一个需要使用的库 它定义了以下内容 typedef void CallbackFunction const int i 并且有一个注册回调的函数 如下所示 void registerCallback CallbackFunction p

随机推荐

  • 暴露 Google Container Engine 中的两个端口

    是否可以在 Google 容器引擎中创建一个公开两个端口的 Pod 端口 8080 正在侦听传入内容 端口 80 将此内容分发给客户端 Google 给出了以下创建 Pod 的命令作为示例 kubectl run hello node im
  • JavaScript JSON 解析器告诉错误位置

    我在解析通过 WebSocket 接收的 JSON 时遇到了一些麻烦 原始问题 解析通过 WebSocket 接收到的 JSON 会导致错误 https stackoverflow com questions 7116035 parse j
  • 枚举类型的复选框列表 MVC Razor

    在我的 c net MVC 应用程序中 我想显示枚举类型的复选框列表 我有一个枚举类型 Flags public enum ModeType Undefined 0 Read 1 Edit 2 我的模型是 Public TrainingMo
  • https 设置后 django 站点 ERR_SSL_PROTOCOL_ERROR

    所以我正在尝试部署我的网站并且基本上尝试过 python manage py check deploy 并遵循它告诉我的一切 WARNINGS security W004 You have not set a value for the S
  • 使用部分字符串 lua 查找完整字符串

    我试图在表中查找整个字符串而不编写完整的字符串 Example maintable SecondString FirstString c First 我怎样才能使用字符串c无需输入整个字符串名称即可查找 FirstString 的完整名称
  • 带有 Bootstrap 布局的 jQuery UI 可拖动

    jQuery 可拖动元素位于引导样式列 col 下 例如 我有两个 row每列分为 4 列 col md 3 我试图将第一行列拖动到第二行可放置列上 但是当我拖动 Drag 元素时 它们总是位于 可放置 元素下方 我无法使用 Bootstr
  • Flutter ScreenState Dispose 方法异常

    当我尝试在颤动中从一个屏幕导航到另一个屏幕时 我收到一个异常 指出我要更改的 ScreenState 不会调用super dispose in its dispose方法 然而 被覆盖的dispose方法明确调用super dispose
  • 使用 l20n 本地化属性

    我想本地化一个placeholder具有 L20N 属性 我在他们的文档中找不到任何内容 并且这样做 毫不奇怪 不起作用
  • Dropzone上传的文件同名

    我有一个带有 dropzone 的普通表单 所有值和文件都上传到服务器 但是当我通过打印 FILES 变量检查它时 所有上传的文件与最后上传的文件具有相同的名称和扩展名 但具有正确的 mime 每个文件的类型 因此 当我上传具有不同文件类型
  • OpenCV 读取不起作用

    I have loop in my C code to open and process a set of images One of those is https i stack imgur com rUJnp gif https i s
  • 如何在 Python 中将表示二进制分数的字符串转换为数字

    假设我们有一个表示二进制分数的字符串 例如 1 以十进制数表示为 0 5 Python 中是否有一种标准方法可以将此类字符串转换为数字类型 无论是二进制还是十进制并不严格重要 对于整数 解决方案很简单 int 101 2 gt gt gt
  • 伪快速排序时间复杂度

    我知道快速排序有O n log n 平均时间复杂度 经常用于演示函数式语言的简洁性的伪快速排序 仅当您从足够远的地方看时 具有适当高的抽象级别时 它才是快速排序 如下 在 Haskell 中给出 quicksort Ord a gt a g
  • GDB:捕获信号并继续调试

    我试图在 GDB 中捕获浮点异常 SIGFPE 而不是将其传递给进程并继续调试 我已经给了 gdb 这个 handle SIGFPE stop nopass 当 SIGFPE 发生时 GDB 会停在正确的位置 问题是我不能也不知道如何继续调
  • 创建相对于 jetpack 中其他元素的垂直链组成 ConstraintLayout?

    我想使用 chainStyle Packed 将标题和描述文本链接到以图像为中心的位置 如何在 jetpack compose 中实现此目的 当我使用时createVerticalChain 它相对于父容器的创建链不是我想要的 有没有办法实
  • 使用 Visual Studio 2013 构建 64 位 Live555

    我正在尝试在 Windows 7 上使用 Visual Studio 2013 64 位构建 Live555 的组件 我尝试编辑 win32config 和 mak 文件 但没有成功 我已经在互联网上搜索了几个小时 并使用命令提示符尝试了各
  • 在 Code Igniter 2.02 中设置电子邮件

    我收到很多错误 我已经在不同的站点尝试了几个建议 删除了父函数 删除了数组 更新了我的 php ini 文件 但没有运气 这是我收到的 13 个错误中的第一个 遇到 PHP 错误 严重性 警告 消息 fsockopen function f
  • std::list 析构函数不阻塞

    我有一个多线程应用程序 有一个循环作为主线程等待用户输入 在正确的输入上 它应该停止循环并等待所有其他线程正确结束 为此 我创建了一个 std list 其中放置了为创建线程而创建的 std future 对象 std list
  • 如何在Silverlight中创建类似WPF的数据触发器?

    我如何为 Silverlight 数据网格创建一个触发器 其中单元格背景颜色根据单元格值而变化 我前段时间参与过一个 WPF 项目 我记得通过 xaml 中的 DataTriggers 实现这一点非常简单 然而 此功能似乎在 Silverl
  • 实体框架数据库第一次重新生成让我失去了手动更改

    我正在使用 MVC NET 制作一个网站 由于我是一名老派程序员 首先学习设计数据库 所以我选择了数据库优先方法 我还使用 代码生成 来创建具有扩展名的文件 tt 到目前为止 除了一件让我困扰的事情之外 一切都正常 经典场景 我意识到我缺少
  • 如何在类库项目中正确定义 DBContext?

    我正在使用实体框架 7 并创建了两个项目 一个项目是 ASP NET 5 Web API 项目 另一个是类库项目 包 我想在其中存储所有数据访问层逻辑 这样我就可以将此包用于另一个报告项目 并且我可能提供的其他附加服务 基本上 我在 Web