在.Net Framework 3.5中使用Entity Framework的奇怪问题

最近有一个项目需要使用Entity Framework,而这个项目恰巧又是一个SharePoint项目,所以只能使用.Net Framework 3.5,于是问题就来了。我试着查询数据库里的记录,可以成功拿到结果,然而当我试着往数据库里写入一条记录时,一个奇怪的异常抛出了……

using (ModelContainer context = new ModelContainer())
{
Account account = Account.CreateAccount(Guid.Empty,
this.tb_name.Text);
context.AddToAccounts(account);
context.SaveChanges();
}

在执行SaveChanges的时候,抛出了一个System.Data.UpdateException,说:

An error occurred while updating the entries. See the InnerException for details.

其InnerException是一个System.Data.EntityCommandCompilationException,它也说:

An error occurred while preparing the command definition. See the inner exception for details.

那就再往里看,这回是一个System.InvalidOperationException,它的话更奇怪:

Server-generated keys are only supported for identity columns. Key column ‘AccountId’ has type ‘SqlServer.uniqueidentifier’, which is not a valid type for an identity column.

AccountId在对象模型中是Guid类型,它对应到SQL Server的uniqueidentifier类型,居然说这个类型不是有效的标识符类型?那干嘛还叫uniqueidentifier嘛。

四处查找了一番,也没找到相关的资料,新建了一个项目也是同样的情况,于是抱着试试看的想法把项目的.Net Framework改成了4.0,一次通过,没有任何错误。

难道是不同.Net Framework对Entity Framework的支持程度不同?再看上面的错误信息,AccountId被设计为又服务器自动生成,所以上面的代码中传递的是Guid.Empty。

于是打开Model.edmx,将AccountId的StoreGeneratedPatternIdentity修改为None,然后重新创建数据库,再将项目的.Net Framework修改回3.5来运行,一次通过,这个问题再也没有出现。

这是个奇怪的问题,网上的相关资料也很少,而且他们的错误原因都是因为使用了SQL CE,而我的项目并没有使用SQL CE。

通过这种方式“解决”这个问题之后,服务器就再也不会为我们生成ID了,于是每次新增数据时都得自己指定一个ID,除此之外倒也没有发现别的影响。

One Comment

  1. tony

    晓伟, 我勒个去, 百度了一下”Server-generated keys are only supported for identity columns. “, 点了第一条进来, 居然是你的blog. 哈哈.
    写的还是去年咱们那个项目…. Account, 哈哈

发表评论

电子邮件地址不会被公开。 必填项已用*标注