Linq 插入数据时报错:主键不能插入NULL值

zhangyumei 2009-12-30 11:48:34
再在使用LINQ 插入数据时遇到个问题,一直报错:主键不能插入NULL值。在网上搜了好久,找到一个和我遇到的问题类似的,可是他是因为表的主键和外键相同引起的,我的表并没有设外键。我的表的主键是UniqueIdentifier NOT NULL类型的,在程序里用System.Guid.NewGuid() 生成主键值,但是在插入的时候一直报主键不能插入NULL值的错误,我在跟踪的时候,看到主键明明是有值的,可是在SubmitChanges时就报错了。请大侠们帮忙解决一下。
...全文
738 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
skying57 2012-06-14
  • 打赏
  • 举报
回复
大哥,把你的linqbase发一下行吗
menglihualuo 2010-01-05
  • 打赏
  • 举报
回复
我也遇到了同样的问题,借鉴了。
zhangyumei 2009-12-31
  • 打赏
  • 举报
回复
目前为止还没有收到满意回答,不过问题最终解决了,我将我的问题与解决办法说一下,希望对同样遇到这个问题的人有用。

错误上面已经说得很详细了,我就说一下引起这个错误的原因吧。由于我的表没有设置timestamp(时间戳),所以更新的时候总是报错,这个就涉及到Linq 更新数据库的原理问题了,我在这里不再多说。我从网上找到的解决方法是 加 timestamp 或 设置主键 IsVersion=true ,我采用了第二种解决办法。所以就出现了“不能将值 NULL 插入列”这样的错误。将 IsVersion=true 去掉,加 timestamp 列,问题解决。
zhangyumei 2009-12-30
  • 打赏
  • 举报
回复
Solution sol= new Solution();//新建一个表的映射对象
sol.SolutionID = System.Guid.NewGuid();//这个是主键列
sol.SolutionName = TextBox1.Text;
sol.ViewCount = 0;
sol.DownLoadCount = 0;
sol.SolutionDescription = TextBox2.Text;
sol.ProductsUsed = TextBox3.Text;
sol.Applicability = TextBox4.Text;
sol.ChiefAdvantage = TextBox5.Text;
sol.ReleaseDate = System.DateTime.Now;
以上是我的给表Solution各个字段赋值的语句,1楼说可能是列的顺序不一样,用Linq插入的时候和列的顺序应该没有关系吧
波导终结者 2009-12-30
  • 打赏
  • 举报
回复
你是不是列的顺序不一样,把别的列插到主键列了
zhangyumei 2009-12-30
  • 打赏
  • 举报
回复
insert into Solution(SolutionID,SolutionName,ViewCount,DownLoadCount,SolutionDescription,ProductsUsed,Applicability,ChiefAdvantage,ReleaseDate)
values('ebf70a9c-b20e-49ed-80cd-8ebc40e469f6','qq',0,0,'qq','qq','qq','qq','2009-12-30 15:49:54')
这样子直接对数据库执行SQL语句,完全没有错,我想应该是Linq SubmitChanges时将主键被置为空了。当我将我的数据库SolutionID的默认值设为newid()时,用Linq插入时不报这个错的。
因为我在后面的程序中要用到刚插入的数据的主键,所以如果SolutionID字段设置默认值的话,在插入后再得到刚插入的数据的主键是一件很麻烦的事。
zhangyumei 2009-12-30
  • 打赏
  • 举报
回复
底层是之前的人写的,我只是在他原来的基础上进行开发,底层的调用关系很复杂,我在这里就将主要的代码贴一下吧

Insert(sol);//执行插入操作,调用Insert(Solution t)方法

public bool Insert(Solution t)
{
using (DataSetDataContext mycon = new DataSetDataContext())
{
try
{
LinqBase.Add(t);//调用Add(TEntity entity)方法

return true;
}
catch
{
return false;
}
}
}

public void Add(TEntity entity)
{
InitDataContext();
m_context.GetTable<TEntity>().InsertOnSubmit(entity);/*跟踪到这里的时候还可以看到SolutionID是不为空的*/
SubmitChanges(m_context);//调用SubmitChanges(TContext context)

}

protected virtual void SubmitChanges(TContext context)
{
try
{
context.SubmitChanges(ConflictMode.ContinueOnConflict);
}
catch (ChangeConflictException)
{
context.ChangeConflicts.ResolveAll(RefreshMode.KeepCurrentValues);
context.SubmitChanges();
}
catch (Exception ex)//运行到这里的时候报错
{
throw ex;
}
}
错误信息:不能将值 NULL 插入列 'SolutionID',表 'OfficeChannel_web.dbo.Solution';列不允许有空值。INSERT 失败。 System.Exception {System.Data.SqlClient.SqlException}
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zhangyumei 的回复:]
Solution sol= new Solution();//新建一个表的映射对象
sol.SolutionID = System.Guid.NewGuid();//这个是主键列
sol.SolutionName = TextBox1.Text;
sol.ViewCount = 0;
sol.DownLoadCount = 0;
sol.SolutionDescription = TextBox2.Text;
sol.ProductsUsed = TextBox3.Text;
sol.Applicability = TextBox4.Text;
sol.ChiefAdvantage = TextBox5.Text;
sol.ReleaseDate = System.DateTime.Now;
以上是我的给表Solution各个字段赋值的语句,1楼说可能是列的顺序不一样,用Linq插入的时候和列的顺序应该没有关系吧
[/Quote]

主键就是不能为NULL值的, 赋值看起来没有问题,那个到summitchanges之间的语句呢?

8,497

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 LINQ
社区管理员
  • LINQ
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧