【问题标题】:Accessing Entity Framework In Class Library From ASP.NET Core Web App从 ASP.NET Core Web 应用程序访问类库中的实体框架
【发布时间】:2016-06-14 14:16:30
【问题描述】:

我的解决方案中目前有 2 个项目,一个 ASP.NET Core Web 应用程序和一个 .NET 4.6.1(非核心)类库。在我的类库中,我添加了 Entity Framework 6,并使用第一代数据库创建了我所有的数据库上下文类。在类库中,一切都按预期工作;但是,当我尝试从 .NET Core Web 应用程序访问 ef 类时,它没有要使用的连接字符串并且失败。

现在,以旧的方式,我知道我可以将连接字符串设置从我的类库中的 app.config 复制到 Web 应用程序中的 web.config,但 .NET Core 不支持这一点。

我已经尝试使用here 概述的步骤,但这仅适用于 Code-First db 生成(我没有这样做)。我还考虑切换到使用 EntityFrameworkCore,但我无法实现 db-first 生成(使用此 overview)。

有什么方法可以实现我想要做的吗?

【问题讨论】:

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


    【解决方案1】:

    以下是如何在代码库中为 EF 模型提供整个配置,以及如何在运行时提供连接字符串。我最近也在为此苦苦挣扎,因为这方面的文档有点难找。

    假设您从数据库生成模型(DB-First):MyEntities.edmx

    您的项目中将有一个部分类,例如:

    public partial class MyEntities : DbContext
    {
        public MyEntities ()
            : base("name=MyEntities")
        {
        }
    
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            throw new UnintentionalCodeFirstException();
        }
    
        public virtual DbSet<MyTable> MyTable { get; set; }
    }
    

    当您在 VS 中生成模型时,如果您选择将连接字符串存储在配置文件中,自动代码生成会将连接字符串配置名称放入构造函数中,如上:public MyEntities(): base("name=MyEntities")

    在您的项目配置中,您将拥有如下内容:

    <configuration> <connectionStrings> <add name="MyEntities" connectionString="metadata=res://MyProject/MyEntities.csdl|res://MyProject/MyEntities.ssdl|res://MyProject/MyExchangeEntities.msl;provider=System.Data.SqlClient;provider connection string='data source=SERVERADDRESS;initial catalog=DATABASENAME;persist security info=True;user id=USERID;password=PASSWORD;MultipleActiveResultSets=True;App=EntityFramework'" /> </connectionStrings> </configuration>

    现在绕过这个,如果你看一下 DbContext 构造函数:public DbContext(string nameOrConnectionString); 它实际上说你可以将连接字符串直接传递给它。

    所以你需要做的就是扩展这个部分类并添加另一个接受连接字符串的构造函数。

    public partial class MyEntities
    {
        /// <summary>
        /// This constructor allows us to pass connection strings at runtime
        /// </summary>
        /// <param name="connectionString">Entity Framework connection string</param>
        public MyEntities(string connectionString) : base(connectionString)
        {
    
        }
    }
    

    尽管这很明显,但我只想提一下,我们扩展了部分类,而不是修改自动生成的类,因此当我们将来重新生成模型时它不会被覆盖。

    要使用连接字符串进行连接,您只需像这样构造对象:new MyEntities("metadata=res://MyProject/MyEntities.csdl|res://MyProject/MyEntities.ssdl|res://MyProject/MyExchangeEntities.msl;provider=System.Data.SqlClient;provider connection string='data source=SERVERADDRESS;initial catalog=DATABASENAME;persist security info=True;user id=USERID;password=PASSWORD;MultipleActiveResultSets=True;App=EntityFramework'");

    最后,如果您也想在代码库中提供 EF 配置,可以这样做:

    /// DbConfiguration belongs to System.Data
    public class EntityFrameworkConfig : DbConfiguration
    {
        public EntityFrameworkConfig()
        {
            //We set configurations for entity framework here so that we don't have to add it in the app.config
            this.SetDefaultConnectionFactory(new SqlConnectionFactory());
            this.SetProviderServices(SqlProviderServices.ProviderInvariantName, SqlProviderServices.Instance);
        }
    }
    
    /// <summary>
    /// This class with the DbConfigurationType attribute allows EntityFramework to know    
    /// to get its config from the EntityFrameworkConfig class instead of the app.config
    /// </summary>
    [DbConfigurationType(typeof(EntityFrameworkConfig))]
    public partial class MyEntities
    {
        /// <summary>
        /// This constructor allows us to pass connection strings at runtime
        /// </summary>
        /// <param name="connectionString">Entity Framework connection string</param>
        public MyEntities(string connectionString) : base(connectionString)
        {
    
        }
    }
    

    【讨论】:

    • 我喜欢这个,因为它看起来很简单……今天就试一试。不过有个问题……有没有办法将连接字符串放在 appsettings.json 文件中,这样我就不必重新编译来更改连接字符串?
    • 好的,我把它全部连接起来了,看起来很有希望,但我仍然收到这个错误:附加信息:上下文正在代码优先模式下使用,代码是从 EDMX 生成的用于数据库优先或模型优先开发的文件。这将无法正常工作。
    • 您是否尝试从连接字符串中删除元数据部分? stackoverflow.com/questions/7944596/…
    • 我做到了,是的,那是我收到错误消息的时候。
    • EntityFramework 实际上需要不同类型的连接字符串。我在上面的答案中更正了它。新的连接字符串示例包含运行所需的 csdl 和 ssdl 文件的位置。
    【解决方案2】:

    长话短说:您必须将 ConnectionString 复制到托管项目的 web.config/app.config 中。 如果没有控制台应用程序/MVC/Web API,您的类库将无法运行,如果没有其中一个应用程序,它只是一个 dll。 所以总结一下,你需要将所有连接字符串和其他重要的内容复制到托管项目的 web.config 文件中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-02
      • 2020-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-20
      • 2021-09-03
      • 2011-03-19
      相关资源
      最近更新 更多