与实体相比,另一层中的 DbContext

Posted

技术标签:

【中文标题】与实体相比,另一层中的 DbContext【英文标题】:DbContext in another layer compared to the Entities 【发布时间】:2021-09-19 04:46:02 【问题描述】:

目前正在学习如何在 .NET core MVC 中实现 DDD 项目,我在尝试使用 efcore 创建 Db 表时遇到了问题。 基本上我所拥有的是以下内容: 我有 3 层,域 + 应用程序 + 基础架构 我的实体在域层中,但我的 DbContext 文件在我的域层中

当我尝试运行命令 add-migration 时,问题就开始了,它给了我以下错误:

no dbcontext was found in assembly 'project.domain'. ensure that you're using the correct assembly and that the type is neither abstract nor generic.

ps:My Domain 层在应用层和基础设施层都被引用,因为我再次关注 DDD。

这是我的 DbContext 文件:

using Domain.Entities;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Infrastructure.Context

    public class ApplicationDbContext : DbContext, IApplicationDbContext
    

        public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options)
        

        

        public DbSet<Product> Products  get; set; 
    

这是我的实体文件:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;

namespace Domain.Entities

    public class Product
    
        [Key]
        public int ProductID  get; set; 
        [Required]
        public string ProductName  get; set; 
        [Required]
        public int ProductPrice  get; set; 
    

然后,为了在Startup.cs 中引用 DbContext,我创建了这个扩展方法:

using Infrastructure.Context;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Project.Infrastructure

    public static class InfrastructureDependencies
    

        public static void AddInfrastructure(this IServiceCollection services) 
        
            services.AddScoped(typeof(IApplicationDbContext), typeof(ApplicationDbContext));
            services.AddDbContext<ApplicationDbContext>(options 
                => options.UseSqlite(@"Data Source=Domain_Layers\ProductDb"));
        
    

【问题讨论】:

在数据包管理器控制台的顶部,将项目更改为 Infrastructure 并再次运行迁移。 感谢您的回复,我试过了,现在说我的应用程序层,没有引用 NuGet EntityFramework.Design,我应该安装它吗?这不会带走 DDD 的意义吗? 现在,在创建 propper 引用并安装 NuGet entityframework.Design 后,我在运行迁移时遇到此错误Unable to create an object of type 'ApplicationDbContext'. For the different patterns supported at design time, see https://go.microsoft.com/fwlink/?linkid=851728 好的,我搞定了!对于将来尝试这样做的任何人,在基础设施层中创建扩展方法的方法可能是一个正确的选择。所以我所做的修复是在应用层引用中添加到域层和基础设施层,然后安装在应用层,Entityframework.Design + EntityFramework.Core 并在 NuGet 包管理器控制台上运行命令add-migration + migrationname。您应该让数据包管理器引用基础设施层,因为 DbContext 在那里 【参考方案1】:

好的,我搞定了!对于将来尝试这样做的任何人,在基础设施层中创建扩展方法的方法可能是一个正确的选择。所以我所做的修复是在应用层引用中添加到域层和基础设施层,然后安装在应用层,Entityframework.Design + EntityFramework.Core 并在 NuGet 包管理器上运行命令add-migration + migrationname安慰。您应该让数据包管理器引用基础设施层,因为 DbContext 在那里

【讨论】:

以上是关于与实体相比,另一层中的 DbContext的主要内容,如果未能解决你的问题,请参考以下文章

caffe中的前向传播和反向传播

业务层中的实例方法与静态方法[关闭]

根据 DTO、实体模型或其他东西验证服务层中的数据?

与 SSMS 相比,实体框架中的查询时间极慢

第三期 OSI七层中第一层 物理层

第三期 OSI七层中第一层 物理层