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

SQL Server Compact不支持服务器生成的密钥和服务器生成的值

如何解决《SQLServerCompact不支持服务器生成的密钥和服务器生成的值》经验,为你挑选了3个好方法。

我刚刚开始使用实体框架,所以我决定将它连接到我现有的SQL Server CE数据库.我有一个IDENTITY(1,1)主键的表,但当我尝试添加实体时,我遇到了上述错误.

从MS Technet artice 我学到了

与实体框架一起使用时,SQL Server Compact不支持具有服务器生成的密钥或值的实体.使用实体框架时,实体的密钥可能会标记为服务器生成.这使数据库能够在插入或实体创建时为密钥生成值.另外,实体的零个或多个属性可以标记为服务器生成的值.有关更多信息,请参阅Entity Framework文档中的Store Generated Pattern主题.虽然实体框架允许您使用服务器生成的键或值定义实体类型,但SQL Server Compact在与实体框架一起使用时不支持具有服务器生成的密钥或值的实体.对具有服务器生成的值的实体的数据操作操作会引发"不支持"异常.

所以现在我有几个问题:

如果不支持将密钥标记为服务器生成,为什么会抛出异常?从引用的段落中很难看出来.

当我试图将StoreGeneratedPattern ="Identity"添加到我的实体的属性时,Studio抱怨它是不允许的.我做错了什么?

此限制的最佳解决方法是什么(包括切换到另一个数据库)?我的限制是零安装和使用实体框架.

mostlytech.. 24

当我遇到这个限制时,我将类型更改为uniqueidentifier



1> mostlytech..:

当我遇到这个限制时,我将类型更改为uniqueidentifier



2> 小智..:

使用uniqueidentifier或手动生成bigint/int键值是最佳选择.

这样的事也许......

    private static object lockObject = new object();

    private static long nextID = -1;

    public static long GetNextID()
    {
        lock (lockObject)
        {
            if (nextID == -1) nextID = DateTime.UtcNow.Ticks; else nextID++;
            return nextID;
        }
    }

这假设您在应用程序运行期间每个tick不会生成多个记录(加上停止和重新启动的时间).我认为这是一个合理的假设,但如果你想要一个完全防弹(但更复杂)的解决方案,那么从数据库中读取最高的ID并从中递增.



3> 小智..:

SQL CE 4.0版通过其Entity Framework提供程序修复了此问题.


我不同意链接的帖子.这是2013年,我在VS2012中使用EF5,并且在保存更改时添加实体时,Uniqueidentifier无法正常工作(如果不是ROWGUID).除非用于SqlCompact的NuGets for EF在某种程度上已经过时了.引发异常:`列'DeviceId'的类型为'SqlServerCe.uniqueidentifier',它不是标识列的有效类型.
推荐阅读
无名有名我无名_593
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有