【发布时间】: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