Изменить Entity Framework Подключение строки к серверу - PullRequest
0 голосов
/ 02 ноября 2018

Вот что у меня есть:

    <add name="gymEntities1" connectionString="metadata=res://*/DateModel.csdl|res://*/DateModel.ssdl|res://*/DateModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=.;initial catalog=gym;user id=sa;password=xxxx;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />

он работает в моей базе данных LocalHost, и я могу загрузить из него свои данные. тем не менее, у меня есть сервер, на котором установлен sqlserver с моей базой данных, в основном, когда я изменяю строку подключения sqlcommands этой работы, но в какой-то части моей программы я использовал Entity Framework и не знаю, как изменить его, соединяющую строку, с некоторыми сообщениями в stackoverflow я изменяю это на

    <add name="gymEntities2" connectionString="metadata=res://*/DataModel.csdl|res://*/DataModel.ssdl|res://*/DataModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=tcp:46.105.124.144;initial catalog = gym ;User ID=sa;Password=xxxx&quot;" providerName="System.Data.EntityClient" />

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

Каков наилучший способ изменить соединительную строку из App.Config?

Ответы [ 5 ]

0 голосов
/ 03 ноября 2018

Вот что я имею с Await

        public async Task GetAccounts()
    {
        MainWin w = new MainWin();

        await Task.Run(() =>

        {

            this.Dispatcher.Invoke(() =>
            {
                using (SqlConnection connection = new SqlConnection(PublicVar.ConnectionString))
                {
                    gymEntities2 database = new gymEntities2();
                    SqlConnection con1 = new SqlConnection(PublicVar.ConnectionString);
                    PublicVar.TodayTime = String.Format("{0:yyyy/MM/dd}", Convert.ToDateTime(TimeNow.Text));
                    con1.Open();


                    SqlCommand Actives = new SqlCommand("Select DISTINCT (LockEndDate) from LockTable Where Username = '" + txt_username.Text + "' and Password = '" + txt_password.Password + "'", con1);
                    object Active = Actives.ExecuteScalar();
                    string SystemActive = Convert.ToString(Active);


                    //   SqlCommand Commandcmds = new SqlCommand("update VW_TimeOut set UserActive = 2 where UserEndDate < '" + String.Format("{0:yyyy/MM/dd}", Convert.ToDateTime(TimeNow.Text)) + "'", con1);
                    //   Commandcmds.ExecuteScalar();


                    SqlCommand Commandcmd = new SqlCommand("SELECT COUNT(*) FROM LockTable Where Username = '" + txt_username.Text + "' and Password = '" + txt_password.Password + "' and LockEndDate between '" + String.Format("{0:yyyy/MM/dd}", Convert.ToDateTime(Lock.Text)) + "' And '" + SystemActive + "'", con1);
                    int userCount = (int)Commandcmd.ExecuteScalar();


                    //Find Gym ID -> To Set Public Value Strings
                    SqlCommand FindGymID = new SqlCommand("Select DISTINCT (LockID) from LockTable Where Username = '" + txt_username.Text + "' and Password = '" + txt_password.Password + "'", con1);
                    object ObGymID = FindGymID.ExecuteScalar();



                    if (userCount > 0)
                    {
                        try
                        {
                            RegistryKey UsernameKey = Registry.CurrentUser.CreateSubKey("SOFTWARE\\GYM");





                            if (CheakRem.IsChecked == true)
                                if ((string)UsernameKey.GetValue("UserNameRegister") != "")
                                {
                                    UsernameKey.SetValue("UserNameRegister", txt_username.Text.Trim());
                                    UsernameKey.SetValue("PasswordRegister", Module.Decode.EncryptTextUsingUTF8(txt_password.Password.Trim()));
                                }

                            PublicVar.GymID = Convert.ToString(ObGymID);
                            login = true;

                        }

                        catch
                        {

                            w.Username = null;
                            w.Password = null;
                        }


                    }
                    else
                    {
                        ErrorPage pageerror = new ErrorPage();
                        pageerror.Show();

                        con1.Close();
                        w.Username = null;
                        w.Password = null;
                    }
                    con1.Close();


                }

            });


        });


        if (login == true)
        {
            w.Username = txt_username.Text;
            w.Password = txt_password.Password;
            w.Show();
            this.Close();
        }
    }
    #endregion

и мой код события

      private async void btn_join_Click(object sender, RoutedEventArgs e)
    {

        await GetAccounts();


    }

но моя программа будет зависать при нажатии кнопки и не ждать работы. ты знаешь почему?

0 голосов
/ 02 ноября 2018

Первый возможный выпуск:

Это менее вероятно , так как другие люди предложили вам. Но, возможно, вы пропустили строку подключения в одном из ваших web.config или app.config. Хорошей привычкой является копирование вашей строки в каждый проект. Пример. У меня есть 3 различных проекта в моем решении (Библиотека, WCF, WPF). Я скопировал следующую строку подключения в каждый проект ( Один образец для локального SQL Server и другой для Azure ):

<connectionStrings>
    <add name="LocalSQLServerSample.CodeREDEntities" connectionString="metadata=res://*/CodeRED.csdl|res://*/CodeRED.ssdl|res://*/CodeRED.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=MachineName\ServerName;initial catalog=CodeRED;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
    <add name="AzureSQLServerSample.CodeREDEntities" connectionString="metadata=res://*/CodeRED.csdl|res://*/CodeRED.ssdl|res://*/CodeRED.msl;provider=System.Data.SqlClient;provider connection string='data source=azureservername.database.windows.net;initial catalog=&quot;CodeRED&quot;;persist security info=True;user id=CodeRED;password=R%Chd$g*VHs28eEr;MultipleActiveResultSets=True;App=EntityFramework'" providerName="System.Data.EntityClient" />
</connectionStrings>

Второй возможный выпуск:

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

Из примера выше: name = "LocalSQLServerSample.CodeREDEntities"

_containerName is CodeREDEntities (То же самое для всех моих соединений). environment - определить, к какой базе данных вы подключаетесь. Например, в приведенном выше примере подключения у меня есть LocalSQLServerSample и AzureSQLServerSample , и у меня обычно есть что-то вроде PRODUCTION , DEVELOPMENT , ИСПЫТАНИЯ ....

    public static ObjectContext getObjectContext(string environment, bool isReadOnly)
    {
        environment = environment == null ? "" : environment.Trim();
        environment = environment.Length == 0 ? "" : (environment + ".");

        ObjectContext objectContext = new ObjectContext(
                ConfigurationManager.ConnectionStrings[environment + _containerName].ToString());
        objectContext.DefaultContainerName = _containerName;
        objectContext.CommandTimeout = 0;

        objectContext.ContextOptions.ProxyCreationEnabled = !isReadOnly;

        return objectContext;
    }

Пример использования:

Common - это общий класс, который я использую для хранения общей информации, такой как получение общего формата ошибок, используемого для Common.getInnerExceptionMessage.

Кроме того, вам не нужно всегда передавать окружение, вы можете сохранить его как константу, чтобы иметь возможность вызывать его, например (я всегда передаю его, чтобы иметь возможность смешивать соединения, когда мне нужно для определенных вызовов): Вы можете изменить соединение из любого места, изменив _selectedEnvironment , если вы не хотите передавать его везде.

    public const string _ENVIRONMENT_DEVELOPMENT = "LocalSQLServerSample";
    public const string _ENVIRONMENT_PRODUCTION = "AzureSQLServerSample";
    public static string _selectedEnvironment = _ENVIRONMENT_PRODUCTION;

Пример получения предмета на основе идентификатора:

Примечание: Пользователь - это класс, созданный структурой сущностей из базы данных.

    public UsersDataGrid GetItem(string environment, long id)
    {
        ObjectContext objectContext = Common.getObjectContext(environment, false);

        try
        {
            var item = objectContext.CreateObjectSet<User>()
                .Where(W => W.ID == id)
                .Select(S => new UsersDataGrid()
                {
                    Active = S.Active,
                    ID = S.ID,
                    Unique_ID = S.Unique_ID,
                    First_Name = S.First_Name.ToUpper(),
                    Last_Name = S.Last_Name.ToUpper(),
                    Email = S.Email,
                    School = S.School.Title.ToUpper(),
                    Gender = S.Gender.Title.ToUpper(),
                    TShirt_Size = S.TShirt_Size.Title.ToUpper(),
                    GUID = S.GUID + "",
                    Note = S.Note,
                    Machine_User = S.Machine_User,
                    Machine_Name = S.Machine_Name,
                    Created_On = S.Created_On,
                    Last_Updated_On = S.Updated_On
                }).FirstOrDefault();

            return item;
        }
        catch (Exception exception)
        {
            return new UsersDataGrid()
            {
                Note = ("Service Error: " +
                Common.getInnerExceptionMessage(exception))
            };
        }
    }

2-й пример: обновление пользователя:

Примечание: Common.CopyValuesFromSourceToDestinationForUpdate - это только обобщенный метод, копирующий элементы из объекта item в entityItem , вместо этого можно обычно копировать значения, например entityItem.ID = item.ID и т. д. ...

    public Result Update(string environment, User item)
    {
        ObjectContext objectContext = WCF_Service_Library.Classes.Common.getObjectContext(environment, false);

        try
        {
            var entityItem = objectContext.CreateObjectSet<User>()
                .AsEnumerable().Where(Item => Item.ID == item.ID).ToList().FirstOrDefault();

            if (entityItem == null)
                return new Result("Item does NOT exist in the database!");

            entityItem = Common.CopyValuesFromSourceToDestinationForUpdate(item, entityItem) as User;

            objectContext.SaveChanges();

            return new Result(entityItem.ID);
        }
        catch (Exception exception)
        {
            return new Result("Service Error: " + Common.getInnerExceptionMessage(exception));
        }
    }

Третья проблема (не похоже, но вы можете столкнуться с ней):

Если вы опубликуете свое приложение и подпишете ТОЛЬКО свой проект WPF, вы не получите ошибку во время публикации, но вы не сможете подключиться к базе данных. Вы должны подписать все свои проекты в вашем решении.

Надеюсь, это поможет вам с вашей проблемой

0 голосов
/ 02 ноября 2018

Эта строка подключения должна работать:

   <add name="Name"
   connectionString="metadata=<Conceptual Model>|<Store Model>|<Mapping Model>;
   provider=<Underlying Connection Provider>;
   provider connection string=&quot;<Underlying ConnectionString>&quot;" 
   providerName="System.Data.EntityClient"/>

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

0 голосов
/ 02 ноября 2018
I hope it is use for you
Add this for App.Config files


<connectionStrings>
  <add name="Dbconnection" 
       connectionString="Server=localhost; Database=OnlineShopping;
       Integrated Security=True"; providerName="System.Data.SqlClient" />
</connectionStrings>
0 голосов
/ 02 ноября 2018

Проверьте WebConfig вашего запуска проекта. Платформа сущностей читает ConnnectionString из AppConfig при запуске операции Update Model From Db.

Но во время выполнения он читает ConnnectionString из WebConfig в вашем проекте запуска

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...