【问题标题】:Change Entity Framework Connecting String To Server将实体框架连接字符串更改为服务器
【发布时间】:2019-04-06 16:29:36
【问题描述】:

这是我目前所拥有的:

    <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 连接字符串时,这项工作但在我的程序的某些部分我使用实体框架并且不知道如何更改它连接字符串,有一些帖子在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" />

但它仍然从我的本地主机读取数据并且没有连接到我的服务器。 我不知道当我将此连接字符串更改为我的服务器时,它仍然从我的本地主机数据库中读取数据。

从 App.Config 更改连接字符串的最佳方法是什么?

【问题讨论】:

    标签: c# wpf server


    【解决方案1】:

    第一个可能的问题:

    不太可能,因为其他人向您建议。但是,您的 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 是 CodeREDEntities(我的所有连接都相同)。 环境 用于确定您要连接到哪个数据库。例如,在上面的连接示例中,我有 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;
    

    根据 id 获取商品的示例:

    注意:User是实体框架从数据库中生成的类。

        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))
                };
            }
        }
    

    第二个示例:更新用户:

    注意: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 项目,您在发布过程中不会出错,但您可能无法连接到数据库。您必须签署解决方案中的所有项目。

    希望这能帮助您解决问题

    【讨论】:

    • 感谢您使用完整的方法。我在这里有一个小问题,我的问题已经解决了,但是你认为哪一个 sqlcommands 或 EntityFramwork 方法的速度比每一个都快吗? Aculy 当我运行我的程序时一切正常,期待我的程序从服务器加载数据的速度,有人告诉我你可以使用 Await,Task.... 你最好的主意是什么?
    • 不客气。我不认为我是帮助你解决这个问题的最佳人选。这取决于尝试做什么,对于不同的情况有几种不同的解决方案。我喜欢使用 await 和 Task,但不一定是为了速度。大多数时候,我使用它来获得响应式 UI 或能够显示请求数据的更新,例如我保存 1000 条新记录。另外,在我看来,您应该避免每次都获取所有数据,而只获取您需要的记录。
    • 继续。例如:我没有在数据网格上启用编辑。我总是将其设为只读并分别处理每个更新/新记录,这会大大提高速度,尤其是当您有很多行时。此外,根据某些情况,您查询它的方式很重要。例如,如果您想获取计数,您不想在 .ToList().Count 之后获取它,而是希望在查询 .Count 的早期使用它来获取已翻译 SQL 查询的计数。过滤数据(.Where 子句)对于加快查询速度非常重要。非常欢迎您给我具体的场景,我会尽力提供帮助。
    • 我无法以表格形式发送我的 qustion:D 对此感到抱歉,我用我的 qustion 发了一个新帖子,请查收。你知道为什么它还不起作用吗?回答完就会被删除。
    • 如果您可以更正代码,请更正该代码并重新发布。复制后我会在那里删除。
    【解决方案2】:
    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>
    

    【讨论】:

      【解决方案3】:

      此连接字符串必须有效:

         <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"/>
      

      如果您在编写连接字符串时遇到任何问题,可以在the page 上使用以下代码。

      【讨论】:

        【解决方案4】:

        检查您的启动项目的WebConfig。当您运行Update Model From Db 操作时,实体框架会从AppConfig 中读取ConnnectionString。

        但在运行时它会从您的启动项目中的WebConfig 读取ConnnectionString

        【讨论】:

        • WPF 应用程序是否使用WebConfig 文件?
        • 我不这么认为
        • 我在我的项目中搜索过,但 WebConfig 不存在。
        • 不,它没有 WebConfig... 它有 app.config... 您的连接应该在那里。但是您的问题更可能出在 ObjectContext 中的 DefaultContainerName 中,因为您可能创建了一个实体(第一个连接),然后您尝试使用具有不同连接的相同创建的实体。查看我下面的帖子以获取更多详细信息。希望这对您有所帮助。祝你好运!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-07
        • 1970-01-01
        • 2011-11-04
        相关资源
        最近更新 更多