【问题标题】:How to change the database in a WCF service connection string?如何更改 WCF 服务连接字符串中的数据库?
【发布时间】:2013-07-10 18:40:12
【问题描述】:

在 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。

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

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

编辑

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

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

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

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

【问题讨论】:

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


    【解决方案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 能够识别我的静态列表中对象的值,但它似乎不能那样工作。

    【讨论】:

      【解决方案2】:

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

      sismos_cfe != cfe_sismos

      【讨论】:

      • 这是我在问题中的拼写错误,数据库名为 sismos_cfe。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-08
      • 1970-01-01
      • 2018-07-04
      • 1970-01-01
      • 2016-11-12
      • 1970-01-01
      相关资源
      最近更新 更多