Передача строки подключения в качестве параметра в конструктор в Code First Entity Framework - PullRequest
0 голосов
/ 22 января 2019

Я передаю строку подключения своим классам сущностей через параметр в конструкторе, например:

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.

Согласно сообщению, которое я нашел на этой ветке, документация гласит:

Должен быть конструктор без параметров

Если я создаю конструктор без параметров, строка подключения не будет установлена, и когда я создаю контекст внутри метода, например:

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

_connectionString будет null и завершится ошибкой при вызове базового конструктора DbContext.

Как передать строку подключения моим классам сущностей, если не через конструктор?

Есть ли лучший способ сделать это? Может быть, путем материализации сущности с моей строкой соединения в качестве параметра или с лучшим запросом?

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Похоже, что вы путаете Site с объектом и SiteContext с DbContext.Сайт должен иметь объект без параметров.SiteContext - это то, что имеет дело со строкой соединения.Сущностям не нужно знать о строке подключения, фактически они вообще не должны знать, что они связаны с базой данных.

Кроме того, у вас есть код

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

Будетустановить строку подключения просто отлично.Конструктор, который соответствует аргументам, в данном случае строке, является тем, который вызывается.

0 голосов
/ 22 января 2019

Ничто не мешает вам иметь два конструктора:

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

 public Site()
 {
 }
...