0

在Azure中,我有一个名为Sismos数据库,这是我的WCF服务的目标,我在Azure上建立这个数据库的副本是这样的:如何更改WCF服务连接字符串中的数据库?

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。

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

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

编辑

我只注意到有当编辑的条目,例如,如果我有我的表中的用户的入口,我编辑的姓氏也是问题和古怪的行为,这种变化不会是当我在Azure上检查我的数据库时反映出来,但是如果我调用返回用户的端点,则会出现更改,我花了一些时间来查看是否有某种延迟阻止在Azure中显示最新值,但是它没有显示任何变化。如何在数据库中进行更改而不在实际数据库中显示这些更改?如果我尝试在表中插入新条目,则条目将显示没有问题。因此,总而言之,通过我的WCF服务中的端点,如果我插入的东西它将显示在天蓝,如果我编辑的东西它不会显示在Azure中(但更改将可用时调用相应的端点),如果我想删除某些内容,则不会在Azure中显示,也不会在调用端点时反映更改。

如果Azure中的数据库没有收到任何更改,那么我在哪里获取所有信息?这就像一个缓存数据库存在的地方,我真的很困惑,原因正在发生。

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

回答

1

我终于找到了古怪行为的原因。问题是,实体框架无法使用从实体框架生成的上下文对象获得的对象复制的对象。

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

所以最终我改变了逻辑的更新和对我的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(); 

我希望实体框架能够识别静态列表中的对象的值,但似乎不能这样工作。

0

你的配置说: “初始目录= sismos_cfe” 但你说: “CREATE DATABASE cfe_sismos”

sismos_cfe!= cfe_sismos

+0

这是一个拼写错误的问题,数据库被称为sismos_cfe。 –

相关问题