【问题标题】:InvalidCastException on LINQ-2-SQL Model When Inserting插入时 LINQ-2-SQL 模型上的 InvalidCastException
【发布时间】:2011-02-23 21:30:49
【问题描述】:

尝试使用 LINQ-to-SQL 将项目插入数据库时​​出现 InvalidCastException。据我所知,一切都是正确的类型。

SQL 表为(略):

CREATE TABLE [dbo].[Timer](
    [TimerId] [int] IDENTITY(1,1) NOT NULL,
    [UserName] [nvarchar](64) NOT NULL,
    [TimeStamp] [datetime] NOT NULL,
    [SessionId] [uniqueidentifier] NOT NULL,
    [Action] [nvarchar](50) NOT NULL,
    [ActionId] [uniqueidentifier] NOT NULL,
    [Description] [nvarchar](256) NOT NULL,
 CONSTRAINT [PK_Timer] PRIMARY KEY CLUSTERED 
(
    [TimerId] ASC
)

LINQ 模型是(删节的):

public partial class Timer
{

    [Column(AutoSync=AutoSync.OnInsert, DbType="Int NOT NULL IDENTITY", IsPrimaryKey=true, IsDbGenerated=true)]
    public int TimerId { get; set; }

    [Column(DbType = "NVarChar(64) NOT NULL", CanBeNull = false)]
    public string UserName { get; set; }

    [Column(DbType = "DateTime NOT NULL")]
    public DateTime TimeStamp { get; set; }

    [Column(DbType = "UniqueIdentifier NOT NULL")]
    public Guid SessionId { get; set; }

    [Column(DbType = "NVarChar(50) NOT NULL", CanBeNull = false)]
    public string Action { get; set; }

    [Column(DbType = "UniqueIdentifier NOT NULL")]
    public Guid ActionId { get; set; }

    [Column(DbType = "NVarChar(256) NOT NULL", CanBeNull = false)]
    public string Description { get; set; }

}

而且违规代码是(删节的):

using (var ctx = new MyDataContext())
{
    var timer = new Timer();
    timer.Action = "Start";
    timer.ActionId = Guid.NewGuid();
    timer.Description = "foo";
    timer.SessionId = Guid.NewGuid();
    timer.TimeStamp = DateTime.UtcNow;
    timer.UserName = "foo";

    ctx.Timers.InsertOnSubmit(timer);
    ctx.SubmitChanges();  // exception thrown here
}

错误消息显示System.InvalidCastException: Specified cast is not valid.,但没有提及导致问题的属性。谁能发现哪个属性给我带来了问题?

【问题讨论】:

  • 尝试运行 SQL 分析器并查看对服务器执行的内容,尝试运行您捕获的内容并查看哪个值是问题
  • @Ivanov 好主意。我假设强制转换是在 SQL 语句运行之前发生的,但它没有发生在另一端。分析后,我可以确认 SQL 语句永远不会运行。在运行任何查询之前抛出异常。
  • 你能在调试器中单步执行并查看内部异常吗?它可能会为您提供有关无效演员发生位置的更多详细信息。
  • 尝试一一删除属性分配,找出问题。
  • @Austin 没有内部异常

标签: c# sql-server linq linq-to-sql .net


【解决方案1】:

您可能想要:

1) 将 TimeStamp 数据类型更改为 DateTime2 - 仅限 SQL Server 2008。

2) 将timer.TimeStamp = DateTime.UtcNow; 更改为timer.TimeStamp = DateTime.Now.ToUniversalTime();

【讨论】:

  • 不幸的是,这些建议都没有奏效。抛出了同样的异常。
【解决方案2】:

我删除了表格,重新创建了它,刷新了我的模型,一切都开始工作了,而无需更改任何其他内容。我不认为有什么改变,但显然.NET 又喜欢我了。

【讨论】:

    【解决方案3】:

    我通过在我的 DBML 中将 Server Data Type 属性设置为 uniqueidentifier 解决了这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-06
      相关资源
      最近更新 更多