ASP.NET动态数据实体+ DateTime列上的主键= FormatException

时间:2013-10-01 11:21:50

标签: entity-framework asp.net-dynamic-data

我正在尝试使用VS 2012(C#)中的“ASP.NET动态数据实体Web应用程序”项目模板构建一个简单的网站。它几乎是标准的模板设置,其中一个实体,其中DateTime类型属性是主键的一部分(基础表在映射列上也有SQL DateTime类型)。当我尝试查看“详细信息”页面或编辑行时,我收到FormatException:

  

字符串未被识别为有效的DateTime。描述:一个   在执行当前Web期间发生了未处理的异常   请求。请查看堆栈跟踪以获取有关的更多信息   错误以及它在代码中的起源。

     

异常详细信息:System.FormatException:无法识别字符串   作为有效的DateTime。

     

来源错误:

     

执行期间生成了未处理的异常   当前的网络请求。有关的来源和位置的信息   可以使用下面的异常堆栈跟踪来识别异常。

     

堆栈追踪:

     

[FormatException:String未被识别为有效的DateTime。]
  System.Web.UI.WebControls.EntityDataSourceView.ExecuteSelect(DataSourceSelectArguments   参数)+965
  System.Web.UI.DataSourceView.Select(DataSourceSelectArguments   参数,DataSourceViewSelectCallback回调)+21
  System.Web.UI.WebControls.DataBoundControl.PerformSelect()+138
  System.Web.UI.WebControls.BaseDataBoundControl.DataBind()+30
  System.Web.UI.WebControls.FormView.DataBind()+ 4
  System.Web.UI.WebControls.BaseDataBoundControl.EnsureDataBound()+ 105   System.Web.UI.WebControls.FormView.EnsureDataBound()+ 178 8   System.Web.UI.WebControls.CompositeDataBoundControl.CreateChildControls()   +75 System.Web.UI.Control.EnsureChildControls()+83 System.Web.UI.Control.PreRenderRecursiveInternal()+42
  System.Web.UI.Control.PreRenderRecursiveInternal()+ 168 8   System.Web.UI.Control.PreRenderRecursiveInternal()+ 168 8   System.Web.UI.Control.PreRenderRecursiveInternal()+ 168 8   System.Web.UI.Control.PreRenderRecursiveInternal()+ 168 8   System.Web.UI.Control.PreRenderRecursiveInternal()+ 168 8   System.Web.UI.Control.PreRenderRecursiveInternal()+ 168 8   System.Web.UI.Page.ProcessRequestMain(布尔   includeStagesBeforeAsyncPoint,Boolean includeStagesAfterAsyncPoint)   974

我尝试在web.config中的<globalization>节点中设置文化,但它没有帮助。 “详细信息”页面的URL包含查询字符串中的列,如下所示:&amp; Created = 09%2F30%2F2013 16%3A10%3A33&amp; Updated = 09%2F30%2F2013 23%3A10%3A40 for Created is' 30-09-2013 16:10:33'并更新'30 -09-2013 23:10:40'。

这是我的第一个动态数据项目,所以我真的不知道该怎么做...在此先感谢您的帮助。

编辑:

添加

<globalization uiCulture="en-US" culture="en-US"/>

到主web.config的system.web节点导致异常消失,但现在Details无法找到正确的行,说“没有这样的项目。”

3 个答案:

答案 0 :(得分:0)

您可能遇到本地化问题,不同国家/地区的日期时间格式可能不同,c#和sql中使用的日期时间格式也不同

尝试以yyyy-mm-dd

等不变格式提交

此外,您应该使用datetimeoffset作为日期时间,它具有更高的精度并且如果我记得正确则占用相同的空间,或者至少使用datetime2作为您的sql数据类型,因为它具有更高的精度并且占用相同或更少的空间。

更新: 解析这些值可能是一个问题,正如Adarsh建议的那样,您可以以编程方式更改您的文化:

// Put the using statements at the beginning of the code module
using System.Threading;
using System.Globalization;
// Put the following code before InitializeComponent()
// Sets the culture to French (France)
Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR");
// Sets the UI culture to French (France)
Thread.CurrentThread.CurrentUICulture = new CultureInfo("fr-FR");

Taken from msdn

您可以尝试查看这可能是问题,然后您可以查看从配置设置或者查看日期时间的不同模型绑定,有几种解决方案取决于适合您的。

答案 1 :(得分:0)

由于您已将datetime定义为主键,因此在发送get请求时由浏览器进行url编码。在使用之前,您应该在视图中解码此值。 Framework正在尝试将编码值解析为datetime,因为这会给出异常。

答案 2 :(得分:0)

我设法解决了这个问题。事实证明基础表没有定义主键,因此所有NOT NULL列(包括两个DateTime列)在该实体框架实体中推断出该表的实体键属性。将这两个属性的“实体键”属性设置为False后,一切都开始正常工作。

这不是一个通用的解决方案,而是针对此特定情况的更多解决方法,其中行由其他列唯一标识,而不是具有DateTime类型的列。如果我真的有一个DateTime列将成为主键的表,我想我会再遇到同样的问题。

关于FormatException,在system.web节点下的web.config中设置<globalization culture="en-US" />修复它,但是在从DateTime列中删除Entity Key属性之后,即使这是不必要的,因为DateTime值不用于构造URI了。