【问题标题】:How to configure Entity Framework in a separate project?如何在单独的项目中配置实体框架?
【发布时间】:2021-10-01 04:03:01
【问题描述】:

我有一个 ASP.NET MVC 应用程序EducationalCenter,项目结构如下:

DbContext 文件是EducationalCenterContext.csData 项目中,如下所示:

public sealed class EducationalCenterContext: DbContext
{
    public DbSet<Student> Students { get; set; }

    public EducationalCenterContext( DbContextOptions<EducationalCenterContext> options)
        : base(options)
    {
        Database.EnsureCreated();
    }
}

而在Startup.cs文件中,ConfigureService()中的dbContext配置如下:

services.AddDbContext<EducationalCenterContext>
                (options => options.UseSqlServer("Server=localhost;Database=EducationalCenterDb;Trusted_Connection=True;MultipleActiveResultSets=true"));

这是我在尝试添加迁移时通过修复错误而得到的工作版本。然而,我的 Web 应用程序对 Data 项目的项目引用对我来说似乎很糟糕。

我的第一个想法是什么:

appsettings.json我创建了这个部分:

"ConnectionStrings": {
    "DefaultConnection":  "Server=localhost;Database=EducationalCenterDb;Trusted_Connection=True;MultipleActiveResultSets=true" 
}

然后我在Common 项目中创建了AppSettings 类:

public class AppSettings
{
    public string ConnectionString { get; set; }
}

然后我尝试通过 DI 在 DAL 中传递ConnectionString

services.Configure<AppSettings>(Configuration.GetSection("ConnectionStrings"));

并创建了EducationalDbContext.cs

public sealed class EducationalCenterContext: DbContext
{
    private readonly string _connectionString;

    public DbSet<Student> Students { get; set; }

    public EducationalCenterContext( IOptions<AppSettings>, DbContextOptions<EducationalCenterContext> options)
        : base(options)
    {
        _connectionString = app.Value.ConnectionString;
        Database.EnsureCreated();
    }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer(_connectionString);
    }
} 

但是当我尝试通过 PM 控制台add-migration 时,我遇到了这个错误:

无法加载程序集“EducationalCenter.Data”。确保它被启动项目“EducationalCenter”引用

然后我添加了项目引用并遇到了下一个错误:

无法创建“EducationalCenterContext”类型的对象。有关设计时支持的不同模式,请参阅https://go.microsoft.com/fwlink/?linkid=851728

然后我在Startup.cs 中添加了services.AddDbContext&lt;&gt; 并来到了我上面提到的工作版本。

所以...

  1. 我的 Web 应用引用数据访问项目是否正常?
  2. 是否可以在Data项目中配置EF,保证DAL、BLL和web app正常分离?

【问题讨论】:

    标签: c# asp.net-mvc entity-framework architecture


    【解决方案1】:

    将上下文和配置放在单独的项目中很好。

    第一个错误是因为“教育中心”被设置为启动项目,但没有引用数据项目。

    第二个错误是因为迁移构建器需要数据项目中的一些连接信息来解析连接(比较EF状态和数据库状态)以确定需要进行哪些更改。

    首先在您的数据项目中添加引用到:

    Microsoft.EntityFrameworkCore.Design
    

    然后在迁移控制台命令将发现的数据项目中添加上下文工厂:

    internal class MyContextFactory : IDesignTimeDbContextFactory<MyContext>
    {
        public MyContext CreateDbContext(string[] args)
        {
            var dbContextBuilder = new DbContextOptionsBuilder<MyContext>();
            var connString = "myconnection string";
            dbContextBuilder.UseSqlServer(connString);
            return new MyContext(dbContextBuilder.Options);
        }
    }
    

    【讨论】:

    • 谢谢,您的解决方案有效!但是,我的 EducationalCenter(网络应用程序)需要参考数据项目。正常吗?
    • 是的,如果您的 WebApp 想要与 EducationalCenter.Data 项目(它显然会)进行通信,那么它将需要对该项目的引用。
    • 感谢您的建议!
    猜你喜欢
    • 2014-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多