Почему я получаю ошибку отсутствия соединения при реализации события? - PullRequest
0 голосов
/ 04 июля 2019

Я создаю настольное приложение, используя c # WinForms и Entity Framework. Я пытаюсь отделить мой взгляд от докладчика событиями, и когда я это делаю, это что-то ломает. Я получаю сообщение об ошибке «Не удается найти строку подключения с именем« TipManagerDBEntities »в файле конфигурации приложения», когда я нажимаю на Form1.cs.

Я проверил файл App.config, чтобы убедиться в наличии строки подключения, и убедился, что файл конфигурации загружается вместе с решением. Я восстановил репо прямо перед тем, как внес изменения в событие, и все работает нормально. Затем я переписываю событие, и оно работает нормально. Когда я сохраняю и открываю проект, я получаю сообщение об ошибке. Когда я отлаживаю программу, она все еще работает нормально, но я не могу найти источник ошибки.

Это стек вызовов для ошибки:

at System.Data.Entity.Internal.LazyInternalConnection.get_ConnectionHasModel()
at System.Data.Entity.Internal.LazyInternalContext.InitializeContext()
at System.Data.Entity.Internal.InternalContext.Initialize()
at System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType)
at System.Data.Entity.Internal.Linq.InternalSet`1.Initialize()
at System.Data.Entity.Internal.Linq.InternalSet`1.get_InternalContext()
at System.Data.Entity.Infrastructure.DbQuery`1.System.Linq.IQueryable.get_Provider()
at System.Linq.Queryable.Sum[TSource](IQueryable`1 source, Expression`1 selector)
at TipManager.Services.Repository.GetSumOfDeposits() in C:\Users\Adam\source\repos\TipManager\Services\Repository.cs:line 15
at TipManager.Services.TipManagerServices.passSumTotalToModel() in C:\Users\Adam\source\repos\TipManager\Services\TipManagerServices.cs:line 22
at TipManager.Presenter.HomePresenter.DisplayTotal() in C:\Users\Adam\source\repos\TipManager\Presenter\HomePresenter.cs:line 34
at TipManager.Presenter.HomePresenter.OnHomeLoaded(Object sender, EventArgs e) in C:\Users\Adam\source\repos\TipManager\Presenter\HomePresenter.cs:line 56
at TipManager.UserControls.Home.Home_Load(Object sender, EventArgs e) in C:\Users\Adam\source\repos\TipManager\UserControls\Home.cs:line 40
at System.Windows.Forms.UserControl.OnLoad(EventArgs e)
at System.Windows.Forms.UserControl.OnCreateControl()
at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
at System.Windows.Forms.Control.CreateControl()
at System.Windows.Forms.Control.ControlCollection.Add(Control value)
at System.Windows.Forms.Form.ControlCollection.Add(Control value)
at System.Windows.Forms.Design.ControlDesigner.DesignerControlCollection.Add(Control c)

Файл App.config, содержащий строку подключения:

<connectionStrings>
    <add name="TipManagerDBEntities" connectionString="metadata=res://*/DBModel.csdl|res://*/DBModel.ssdl|res://*/DBModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=DESKTOP-GNG12RP\SQLEXPRESS;initial catalog=TipManagerDB;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>

Вид с интерфейсом IHome:

public partial class Home : UserControl, IHome
    {
        //private HomePresenter presenter;

        public Home()
        {
            InitializeComponent();
            new HomePresenter(this);

        }
        private void Home_Load(object sender, EventArgs e)
        {
            //presenter = new HomePresenter(this);
            //presenter.DisplayTotal();
            EventHandler handler = homeLoaded;
            handler?.Invoke(this, e);
        }

Ведущий:

class HomePresenter
{
    TipManagerModel tipManager = new TipManagerModel();

    TipManagerServices services;

    private IHome homeView;

    public HomePresenter(IHome view)
    {
        homeView = view;
        services = new TipManagerServices(tipManager);
        homeView.homeLoaded += new EventHandler(OnHomeLoaded);
    }

    public void OnHomeLoaded(object sender, EventArgs e)
    {
        DisplayTotal();
    }

Как ни странно, все по-прежнему работает, как и ожидалось, но я получаю большую страницу с ошибкой, блокирующую моего дизайнера с возможностью игнорировать и продолжить, но я бы хотел выяснить причину проблемы. В представлении, когда я использую закомментированный код для создания и вызова самого Presenter, я не получаю эту ошибку, но когда я использую событие, это происходит каждый раз. Есть идеи, что я делаю не так?

1 Ответ

0 голосов
/ 06 июля 2019

Событие не имело ничего общего с проблемой.Строка подключения была проблемой.Сначала я скопировал строку подключения из файла app.config, исключая часть имени провайдера в конце, и изменил "" "на" '". Затем передал строку непосредственно в базовый конструктор в файле контекста следующим образом:

public partial class TipManagerDBEntities : DbContext
{
    public TipManagerDBEntities()
        : base(@"metadata=res://*/DBModel.csdl|res://*/DBModel.ssdl|res://*/DBModel.msl;provider=System.Data.SqlClient;provider connection string=';data source=DESKTOP-GNG12RP\SQLEXPRESS;initial catalog=TipManagerDB;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework';")
    {
    }

Честно говоря, я не знаю точно, почему это решило проблему. Программа все еще могла подключаться к базе данных и запрашивать данные, но вы получите сообщение об ошибке.

...