【问题标题】:Passing Connection String as a parameter in constructor in Code First Entity Framework在 Code First Entity Framework 的构造函数中将连接字符串作为参数传递
【发布时间】:2019-06-16 07:47:04
【问题描述】:

我通过构造函数中的参数将连接字符串传递给我的实体类,如下所示:

public class Site : ISite
{
    private readonly string _connectionString;

    public Site(string connectionString)
    {
        _connectionString = connectionString;
    }

当我这样查询数据库时抛出异常:

var site = db.Sites.FirstOrDefault(s => s.Name.Equals(name));

例外:

InvalidOperationException: The class 'AuctionSite.Site' has no parameterless constructor.

根据我在this 线程上找到的帖子,文档指出:

必须有无参构造函数

如果我创建无参数构造函数,则不会设置连接字符串,并且当我在方法内创建上下文时,例如:

public IEnumerable<IUser> GetUsers()
{
    using (var db = new SiteContext(_connectionString))
    {
        return db.Users;
    }
}

_connectionString 将是 null,并且在调用 DbContext 的基本构造函数时会失败。

如果不通过构造函数,我应该如何将连接字符串传递给我的实体类?

有没有更好的方法来做到这一点? 也许通过使用我的连接字符串作为参数或使用更好的查询来实现实体?

【问题讨论】:

  • 类“AuctionSite.Site”没有无参数构造函数。这和SiteContext的构造函数有什么关系?

标签: c# entity-framework ef-code-first connection-string dbcontext


【解决方案1】:

没有什么可以阻止你拥有两个构造函数:

 public Site(string connectionString)
 {
     _connectionString = connectionString;
 }

 public Site()
 {
 }

【讨论】:

  • 是的,但是如果我在使用空构造函数创建的站点上调用 GetUsers(),我的连接字符串将是 null
  • 标准做法是将连接字符串存储在 web.config 文件中,以便您的 Site 类可以从那里读取值。
【解决方案2】:

看起来您可能会混淆 Site 实体和 SiteContext DbContext。实体需要具有无参数构造函数的站点。 SiteContext 是处理连接字符串的东西。实体不需要知道连接字符串,实际上他们根本不应该知道它们与数据库相关。

另外还有你拥有的代码

public IEnumerable<IUser> GetUsers()
{
    using (var db = new SiteContext(_connectionString))
    {
        return db.Users;
    }
}

将设置连接字符串就好了。匹配参数的构造函数,在本例中为字符串,是被调用的构造函数。

【讨论】:

  • 这是一个大学项目,我的实体是给定接口的实现,所以我不会混淆 2。虽然在这种情况下你所说的通常是正确的,但我的实体确实知道连接字符串并且有实现与您引用的查询类似的查询。
  • 大学或没有实体知道他们的数据库违反了 SOLID 原则(单一责任),不应该这样做。我鼓励你回到你的教授那里,确保你有正确的方法。
猜你喜欢
  • 2011-10-24
  • 2011-05-06
  • 2015-10-11
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-13
相关资源
最近更新 更多