如何在WCF服务连接字符串中更改数据库?

时间:2013-07-10 18:40:13

标签: wcf web-services azure connection-string azure-sql-database

在Azure中,我有一个名为Sismos的数据库,这是我的WCF服务的目标,我在Azure上创建了这个数据库的副本:

CREATE DATABASE sismos_cfe AS COPY OF Sismos;

这是因为初始数据库仅用于测试并将用于其他目的,而这个新数据库将处理此WCF服务的所有工作。

在我的WCF服务中,我更改了Web.config文件中的以下行:

<connectionStrings>
    <add name="Model1Container" connectionString="metadata=res://*/Sismos.csdl|res://*/Sismos.ssdl|res://*/Sismos.msl;
    provider=System.Data.SqlClient;provider connection string=&quot;data source=*******.database.windows.net;
    initial catalog=Sismos;persist security info=True;user id=*******;password=*****;
    multipleactiveresultsets=True;application name=EntityFramework&quot;" providerName="System.Data.EntityClient" />
</connectionStrings>

有了这个:

<connectionStrings>
    <add name="Model1Container" connectionString="metadata=res://*/Sismos.csdl|res://*/Sismos.ssdl|res://*/Sismos.msl;
    provider=System.Data.SqlClient;provider connection string=&quot;data source=******.database.windows.net;
    initial catalog=sismos_cfe;persist security info=True;user id=*****;password=******;
    multipleactiveresultsets=True;application name=EntityFramework&quot;" providerName="System.Data.EntityClient" />
</connectionStrings>

我的app.cofig文件中的这一行:

<connectionStrings>
    <add name="Model1Container" connectionString="metadata=res://*/Sismos.csdl|res://*/Sismos.ssdl|res://*/Sismos.msl;
    provider=System.Data.SqlClient;provider connection string=&quot;data source=******.database.windows.net;
    initial catalog=Sismos;persist security info=True;user id=****;password=*****;
    multipleactiveresultsets=True;application name=EntityFramework&quot;" providerName="System.Data.EntityClient" />
</connectionStrings>

有了这个:

<connectionStrings>
    <add name="Model1Container" connectionString="metadata=res://*/Sismos.csdl|res://*/Sismos.ssdl|res://*/Sismos.msl;provider=System.Data.SqlClient;
    provider connection string=&quot;data source=******.database.windows.net;
    initial catalog=sismos_cfe;persist security info=True;user id=****;password=*****;
    multipleactiveresultsets=True;application name=EntityFramework&quot;" providerName="System.Data.EntityClient" />
</connectionStrings>

正如你所看到的,我只替换了initial catalog属性的值,而不是指向Sismos,它现在应该指向cfe_sismos。

我遇到的问题是,当我尝试访问一个处理删除数据库中条目的端点时,根本不会对数据库进行任何更改。通过选择条目或编辑/插入条目的操作,没有问题。使用S initial catalog属性值,任何端点都没有问题,理论上任何数据库访问都应该定向到cfe_sismos数据库。

我替换initial catalog属性值是不够的?任何帮助将不胜感激。

修改

我刚刚注意到编辑条目时也存在问题和奇怪的行为,例如,如果我的表中有条目用户和我编辑Last_Name,当我在Azure上检查我的数据库时,不会反映更改,但是如果我调用返回用户的端点,则会出现更改,我花了一些时间查看是否存在某种延迟,导致无法显示Azure中的最新值,但它没有显示任何更改。如果没有在实际数据库中显示这些更改,我如何在数据库中进行更改?如果我尝试在表中插入新条目,则该条目将显示没有问题。

总而言之,通过我的WCF服务中的端点,如果我插入一些东西,它将以azure显示,如果我编辑某些东西,它将不会在Azure中显示(但是当调用相应的端点时,更改将可用)如果我想删除某些内容,它将不会在Azure中显示,也不会在调用端点时反映出更改。

如果Azure中的数据库没有收到任何更改,那么我在哪里可以获得所有信息?它就像一个缓存的数据库存在于某个地方,我真的很困惑,因为这种情况正在发生。

我对这种奇怪的行为感到很困惑,所以我希望有人可以帮助我。提前谢谢。

2 个答案:

答案 0 :(得分:1)

我终于找到了奇怪行为的原因。问题是,Entity Framework无法处理从Entity Framework生成的Context对象中获取的另一个对象复制的对象。

我正在做的是将来自我的实体的数据存储到静态列表中,以避免尽可能多的数据库连接,仅在需要插入,更新或删除操作时建立连接。但是当我尝试从这些列表中获取对象并使用它来更新或删除数据库时,由于它不是从上下文中获取的,因此操作无效。这就是为什么只有插入操作才能正常工作,因为它们是新对象,并且可以与上下文无关联地进行交互。

所以最后我更改了DAO类的更新和删除操作的逻辑,所以不要这样做:

Clusters cluster = (from c in DatabaseInfoHolder.ListaClusters 
    where c.ClusterId == model.ClusterId select c).FirstOrDefault();

我接受了这个:

Clusters cluster = (from c in context.Clusters 
    where c.ClusterId == model.ClusterId select c).FirstOrDefault();

我希望Entity Framework能够识别静态列表中对象的值,但似乎它不会那样工作。

答案 1 :(得分:0)

您的配置显示“initial catalog = sismos_cfe”但您说“CREATE DATABASE cfe_sismos”

sismos_cfe!= cfe_sismos