【问题标题】:Updated Table Returning Error When Query with ASP.NET Web API2 Service使用 ASP.NET Web API2 服务查询时更新表返回错误
【发布时间】:2015-03-20 15:30:35
【问题描述】:

我正在开发一个 WindowsPhone 8.1 应用程序,并且我有一个连接到托管在 Azure 网站上的 Web API 服务器的 SQL 数据库。最近,数据库人员更新了数据库,添加了一个新表,并将示例数据添加到还没有的表中。通过 Azure 管理数据库时,我可以看到所有表中都有数据,但是当我尝试使用 /api/entityname url 检索它们时,它会返回一条错误消息。

有几点需要注意,服务器连接的数据库自从我最初发布它以来已经发生了变化。我尝试再次运行启用迁移和更新数据库命令,但我不知道如何选择它现在连接的新数据库。我需要重新发布服务器吗?为新数据库运行迁移命令?我很犹豫是否要自己尝试涉及数据库连接的事情,因为我对此了解不多,也不想弄乱任何配置。我有一个 .NET 后端。提前感谢您的帮助。

更新:

我进入了我的 Services 项目的 Web.Config 文件,并将连接字符串中的目录值更改为我的新数据库的名称。现在,当我尝试使用 /api/teams 扩展名获取游戏值时出现以下错误:

发生了错误。 'ObjectContent1' type failed to serialize the response body for content type 'application/xml; charset=utf-8'.</ExceptionMessage><ExceptionType>System.InvalidOperationException</ExceptionType><StackTrace/><InnerException><Message>An error has occurred.</Message><ExceptionMessage>The 'GameTime' property on 'Game' could not be set to a 'System.TimeSpan' value. You must set this property to a non-null value of type 'System.Byte[]'. </ExceptionMessage><ExceptionType>System.InvalidOperationException</ExceptionType><StackTrace> at System.Data.Entity.Core.Common.Internal.Materialization.Shaper.ErrorHandlingValueReader1.GetValue(DbDataReader 阅读器,Int32 序数)在 System.Data.Entity.Core.Common.Internal.Materialization.Shaper.GetPropertyValueWithErrorHandling[TProperty](Int32 序数,字符串属性名称,字符串类型名称)在 lambda_method(闭包,Shaper)在 System.Data.Entity.Core.Common.Internal.Materialization.Shaper.HandleEntityAppendOnly[TEntity](Func2 constructEntityDelegate, EntityKey entityKey, EntitySet entitySet)
at lambda_method(Closure , Shaper ) at System.Data.Entity.Core.Common.Internal.Materialization.Coordinator
1.ReadNextElement(Shaper 整形器)在 System.Data.Entity.Core.Common.Internal.Materialization.Shaper1.SimpleEnumerator.MoveNext() at System.Data.Entity.Internal.LazyEnumerator1.MoveNext() 在 WriteArrayOfGameToXml(XmlWriterDelegator,对象, XmlObjectSerializerWriteContext , CollectionDataContract )在 System.Runtime.Serialization.CollectionDataContract.WriteXmlValue(XmlWriterDelegator xmlWriter,对象 obj,XmlObjectSerializerWriteContext 上下文)在 System.Runtime.Serialization.XmlObjectSerializerWriteContext.WriteDataContractValue(DataContract dataContract, XmlWriterDelegator xmlWriter, 对象 obj, RuntimeTypeHandle 声明的TypeHandle) 在 System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeWithoutXsiType(DataContract dataContract, XmlWriterDelegator xmlWriter, 对象 obj, RuntimeTypeHandle 声明的TypeHandle) 在 System.Runtime.Serialization.DataContractSerializer.InternalWriteObjectContent(XmlWriterDelegator 作家,对象图,DataContractResolver dataContractResolver)在 System.Runtime.Serialization.DataContractSerializer.InternalWriteObject(XmlWriterDelegator 作家,对象图,DataContractResolver dataContractResolver)在 System.Runtime.Serialization.XmlObjectSerializer.WriteObjectHandleExceptions(XmlWriterDelegator 作家,对象图,DataContractResolver dataContractResolver)在 System.Runtime.Serialization.DataContractSerializer.WriteObject(XmlWriter 作家,对象图)在 System.Net.Http.Formatting.XmlMediaTypeFormatter.WriteToStream(类型 类型、对象值、流 writeStream、HttpContent 内容)在 System.Net.Http.Formatting.XmlMediaTypeFormatter.WriteToStreamAsync(类型 类型、对象值、流 writeStream、HttpContent 内容、 TransportContext transportContext, CancellationToken 取消令牌) --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务)在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)在 System.Runtime.CompilerServices.TaskAwaiter.GetResult()
在 System.Web.Http.WebHost.HttpControllerHandler.d__1b.MoveNext()

我认为我正在取得一些进展,但我在将应用程序连接到数据库方面并不是很有经验,所以我犹豫是否要四处寻找。在此先感谢您的帮助。我正在使用数据优先迁移(数据库中的 EF 设计器)。此外,仅当我通过 localhost 在本地运行服务时,才会显示上述错误消息。当我通过它托管的 azurewebsites url 运行它时,我得到以下信息:

发生错误。

我认为这是因为我的数据库更新没有发布到托管站点,对吗?我使用 Firefox 作为我的浏览器。如果我使用 IE,我无法下载或打开新实体的 JSON 文件。

【问题讨论】:

    标签: azure asp.net-web-api2 database-migration


    【解决方案1】:

    在朋友的帮助下,我设法解决了这个问题。万一有人看到这篇文章,问题是由于数据库和服务器数据对象之间的数据类型冲突。可以在https://msdn.microsoft.com/en-us/library/cc716729%28v=vs.110%29.aspx 找到 C# 和 SQL Server 之间的数据类型映射列表。根据链接图表匹配数据类型,并确保任何其他数据库约束(即:必需等)包含在注释中。此外,请确保更新服务器上下文文件中的任何代码以匹配数据类型更改。例如,我的 OnModelCreating 方法中有以下代码:

    modelBuilder.Entity<Game>()
                .Property(e => e.GameTime)
                .IsFixedLength();
    

    一旦我将 GameTime 更改为 DateTime 属性,.IsFixedLength();不再适用于它,所以我不得不将其注释掉。当您进行这些更改时,您可以通过在本地调试您的服务器来测试它们,但您必须将其发布回它托管的 url 才能看到更改发生在您的远程服务器上。就我而言,我不得不重新发布我的 azurewebsites.net 网站。我希望这可以帮助遇到类似问题的任何人。

    【讨论】:

      猜你喜欢
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-04
      • 2011-01-26
      • 2011-05-05
      • 1970-01-01
      相关资源
      最近更新 更多