<add name="gymEntities1" connectionString="Metadata=res://*/DateModel.csdl|res://*/DateModel.ssdl|res://*/DateModel.msl;provider=System.Data.sqlClient;provider connection string="data source=.;initial catalog=gym;user id=sa;password=xxxx;MultipleActiveResultSets=True;App=EntityFramework"" 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="data source=tcp:46.105.124.144;initial catalog = gym ;User ID=sa;Password=xxxx"" providerName="System.Data.EntityClient" />
但它仍然从我的localhost读取数据,而不是连接到我的服务器.
我不知道当我将这个连接字符串更改为我的服务器时,它仍然从我的localhost数据库中读取数据.
从App.Config更改连接字符串的最佳方法是什么?
解决方法
由于其他人向您建议,它不太可能.但是,您可能缺少web.config或app.config中的连接字符串.
将字符串复制到每个项目都是一个好习惯.例.我的解决方案中有3个不同的项目(Library,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="data source=MachineName\ServerName;initial catalog=CodeRED;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" 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="CodeRED";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,TESTING ….
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获取项目的示例:
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只是将项目从项目对象复制到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项目,则在发布期间不会出现错误,但您可能无法连接到数据库.您必须在解决方案中签署所有项目.
希望这可以帮助您解决问题