当前位置:  开发笔记 > 数据库 > 正文

LINQ to SQL -

如何解决《LINQtoSQL-》经验,为你挑选了0个好方法。

我正在尝试使用LINQ将记录插入到子表中,并且我收到"指定的强制转换无效"错误,该错误与所涉及的密钥有关.堆栈跟踪是:

消息:指定的强制转换无效.

类型:System.InvalidCastException源:System.Data.Linq TargetSite:Boolean TryCreateKeyFromValues(System.Object [],V ByRef)HelpLink:null Stack:at System.Data.Linq.IdentityManager.StandardIdentityManager.SingleKeyManager2.TryCreateKeyFromValues(Object[] values, V& v) at System.Data.Linq.IdentityManager.StandardIdentityManager.IdentityCache2.Find(Object [] keyValues)在System.Data.Linq.IdentityManager.StandardIdentityManager.Find(MetaType type,Object [] keyValues)处于System.Data.Linq.CommonDataServices.GetCachedObject(MetaType type,Object [] keyValues)at at系统.Data.Linq.ChangeProcessor.BuildEdgeMaps()的System.Data.Linq.ChangeProcessor.GetOtherItem(MetaAssociation assoc,Object实例)位于System.Data.Linq.DataContext的System.Data.Linq.ChangeProcessor.SubmitChanges(ConflictMode failureMode) System.Data.Linq.DataContext.SubmitChanges()中的.SubmitChanges(ConflictMode failureMode)

(.....)

以下代码抛出此错误:

 ResponseDataContext db = new ResponseDataContext(m_ConnectionString);
 CodebookVersion codebookVersion = db.CodebookVersions.Single(cv => cv.VersionTag == m_CodebookVersionTag);
 ResponseCode rc = new ResponseCode()
    {
       SurveyQuestionName = "Q11",
       Code = 3,
       Description = "Yet another code"
    };
 codebookVersion.ResponseCodes.Add(rc);
 db.SubmitChanges(); //exception gets thrown here

有问题的表格在两者之间具有FK关系.
父表的列名为'id',是PK,类型为:INT NOT NULL IDENTITY
子表的列名为'responseCodeTableId',类型为:INT NOT NULL.

codebookVersion(父类)映射到表tblResponseCodeTable
responseCode(childClass)映射到表tblResponseCode

如果我直接执行SQL,它可以工作.例如

INSERT INTO tblResponseCode 
(responseCodeTableId, surveyQuestionName, code, description)
VALUES (13683, 'Q11', 3, 'Yet another code')

对同一个类的更新正常工作.例如

codebookVersion.ResponseCodes[0].Description = "BlahBlahBlah";
db.SubmitChanges(); //no exception - change is committed to db

我在.Add()操作之后检查了变量rc,它确实收到了正确的responseCodeTableId,正如我所期望的那样,因为我将它添加到该集合中.

tblResponseCodeTable's full definition:
COLUMN_NAME TYPE_NAME
id                  int identity
responseCodeTableId int
surveyQuestionName  nvarchar
code                smallint
description         nvarchar
dtCreate            smalldatetime

dtCreate的默认值为GetDate().

我能想到的另一个有用的信息就是没有SQL对数据库进行过尝试,所以LINQ在它尝试之前就会爆炸(因此错误不是SqlException).我已经分析并验证了没有尝试在数据库上执行任何语句.

当你和非PK领域有关系时,我已经阅读并看到了问题,但这不适合我的情况.

任何人都可以为我解释这种情况吗?我在这里错过了什么令人难以置信的事情?

非常感谢.
Paul Prewett

推荐阅读
地之南_816
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有