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

Entity framework ASP.NET动态数据实体+DateTime列上的主键=FormatException,entity-framework,asp.net-dynamic-data,Entity Framework,Asp.net Dynamic Data,我正在尝试使用VS 2012 C中的ASP.NET Dynamic Data Entities Web应用程序项目模板构建一个简单的网站。这几乎是标准模板设置,其中一个实体的DateTime type属性是主键的一部分。基础表的映射列上也有SQL DateTime类型。当我尝试查看详细信息页面或编辑行时,会出现FormatException: 字符串未被识别为有效的日期时间。描述:安 执行当前网站时发生未处理的异常 要求请查看堆栈跟踪以了解有关堆栈的更多信息 错误及其在代码中的起源 异常详细信息

我正在尝试使用VS 2012 C中的ASP.NET Dynamic Data Entities Web应用程序项目模板构建一个简单的网站。这几乎是标准模板设置,其中一个实体的DateTime type属性是主键的一部分。基础表的映射列上也有SQL DateTime类型。当我尝试查看详细信息页面或编辑行时,会出现FormatException:

字符串未被识别为有效的日期时间。描述:安 执行当前网站时发生未处理的异常 要求请查看堆栈跟踪以了解有关堆栈的更多信息 错误及其在代码中的起源

异常详细信息:System.FormatException:无法识别字符串 作为有效的日期时间

源错误:

在执行过程中生成了未处理的异常 当前web请求。关于货物来源和位置的信息 可以使用下面的异常堆栈跟踪来识别异常

堆栈跟踪:

[格式异常:字符串未被识别为有效的日期时间。] System.Web.UI.WebControl.EntityDataSourceView.ExecuteSelectDataSourceSelectArguments 参数+965 System.Web.UI.DataSourceView.SelectDataSourceSelectArguments 参数,DataSourceViewSelectCallback+21 System.Web.UI.WebControl.DataBoundControl.PerformSelect+138 System.Web.UI.WebControl.BaseDataBoundControl.DataBind+30 System.Web.UI.WebControl.FormView.DataBind+4 System.Web.UI.WebControl.BaseDataBoundControl.EnsureDataBound+105 System.Web.UI.WebControl.FormView.EnsureDataBound+178 System.Web.UI.WebControl.CompositeDataBoundControl.CreateChildControls +75 System.Web.UI.Control.EnsureChildControl+83 System.Web.UI.Control.PreRenderCursiveInternal+42 System.Web.UI.Control.PreRenderRecursiveInternal+168 System.Web.UI.Control.PreRenderRecursiveInternal+168 System.Web.UI.Control.PreRenderRecursiveInternal+168 System.Web.UI.Control.PreRenderRecursiveInternal+168 System.Web.UI.Control.PreRenderRecursiveInternal+168 System.Web.UI.Control.PreRenderRecursiveInternal+168 System.Web.UI.Page.ProcessRequestMain布尔值 IncludeStages在区域同步点之前,布尔值IncludeStages在区域同步点之前 +974

我尝试在web.config的节点中设置区域性,但没有帮助。 详细信息的URL页面包含查询字符串中的列,如下所示:&Created=09%2F30%2F2013 16%3A10%3A33&Updated=09%2F30%2F2013 23%3A10%3A40,其中创建的行为“30-09-2013 16:10:33”,更新的行为“30-09-2013 23:10:40”

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

编辑:

添加

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

主web.config的system.web节点导致异常消失,但现在详细信息找不到正确的行,表示没有此类项。

可能存在本地化问题,不同国家的日期时间格式可能不同,在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");

您可以尝试一下,看看这是否是问题所在,然后您可以从配置中查看设置,或者查看datetime的不同modelbinding,有几种解决方案取决于适合您的方式。

因为您已将datetime定义为主键,所以在发送get请求时,它是由浏览器进行url编码的。在使用该值之前,应在视图中对其进行解码。框架正在尝试将编码值解析为datetime,因为出现了这个异常。

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

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


关于FormatException,system.web节点下的web.config中的设置修复了它,但是在从DateTime列中删除Entity Key属性之后,甚至这都是不必要的,因为DateTime值不再用于构造URI。

。不幸的是,我不能改变t
他现在正在输入SQL,但我觉得C安装程序和SQL之间的差异可能就是这种情况。你能告诉我,在我的C应用程序的范围内,我可以在哪里设置区域性,就像我说的那样,我尝试了无效的方法吗?HttpServerUtility.UrlDecode或者在这种情况下可能会有所帮助谢谢,我将对此进行调查。同时,我添加了>Thread.CurrentThread.CurrentCulture=新文化信息;>Thread.CurrentThread.CurrentUICulture=新文化信息;到Site.master OnInit事件。例外情况消失,但详细信息显示没有此类项目。。URL被创建为=09%2F30%2F2013 16%3A10%3A33&Updated=09%2F30%2F2013 23%3A10%3a40我已经解决了这个问题,通过更改web.config中的区域性,我没有发现异常,但是详细信息页面没有找到我尝试按照您的建议解码URL的项目,并且以类似于此处显示的方式,但这没有帮助。我想在我有意识地解决这个问题之前,我必须试着弄清楚动态数据是如何工作的…@Caleb9试着研究模型绑定,你可以为datetime创建自己的定制modelbinder,我想我有一次遇到了你的问题,它只发生在使用GET请求而不是POST时,因为波斯特能够使用正确的文化。此外,您应该始终在get请求中使用日期的固定区域性格式,例如,使用具有固定日期的隐藏字段并提交该字段,而不是具有特定区域性表示的真实字段。谢谢Adarsh,你能给我介绍一些教程或者其他我能找到如何做的东西吗?正如我所说,这是我的第一个动态数据项目,我还不太了解我的方法。@Caleb9:我永远不会建议您使用DateTime数据类型作为主键。这总是一个坏习惯。使用一些其他的数据类型,比如string、int等,你的问题就会得到解决。这是真的,如果你看看我解决问题的方式,那就是问题所在。不幸的是,我无法更改该表,因为它在系统的其他部分中使用,我花了一段时间才发现可以删除EF模型中DateTime列的Entity Key属性。谢谢你的帮助。