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

我刚开始玩entity framework,所以我决定把它连接到我现有的SQL Server CE数据库。 我有一个IDENTITY(1,1)主键的表,但是当我试图添加一个实体,我有上述错误。

从MS Technet artice我了解到

与entity framework一起使用时,SQL Server Compact不支持具有服务器生成的键或值的实体。 使用entity framework时,实体的密钥可能被标记为服务器生成的。 这使数据库能够为插入或创build实体时的密钥生成一个值。 此外,实体的零个或多个属性可能被标记为服务器生成的值。 有关更多信息,请参阅entity framework文档中的“存储生成的模式”主题。 虽然entity framework允许您使用服务器生成的键或值来定义实体types,但SQL Server Compact不支持与entity framework一起使用服务器生成的键或值的实体。 具有服务器生成值的实体上的数据操作操作会引发“不支持”exception。

所以现在我有几个问题:

  • 为什么你会把键标记为服务器生成的,如果不支持,会抛出一个exception? 从引用的段落中很难理解。
  • 当我试图将StoreGeneratedPattern =“Identity”添加到我的实体的属性中时,Studio抱怨说这是不允许的。 我做错了什么?
  • 这个限制的最佳解决方法是什么(包括切换到另一个数据库)? 我的限制是零安装和使用entity framework。

当我遇到这个限制时,我把types改为uniqueidentifier

使用uniqueidentifier或手动生成bigint / int键值是您的最佳select。

也许这样的事情…

  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; } } 

这假定您在应用程序运行期间不会生成每个logging的多个logging(加上停止和重新启动的时间)。 我相信这是一个合理的假设,但是如果您想要一个完全符合防弹(但更为复杂)的解决scheme,请从数据库中读取最高的ID并从中增加。

SQL CE版本4.0修复了它的entity framework提供者的这个问题。

我刚才也碰到了这个问题… Mosttech的答案可能是最好的select,GUID是非常容易使用和关键碰撞的风险是非常低的(虽然并不遥远)。

  • 为什么你会把键标记为服务器生成的,如果不支持,会抛出一个exception? 从引用的段落中很难理解。

因为SQL Server(不是Compact)支持它,所以其他第三方也可以支持它…entity framework不仅适用于SQL Server Compact;)

就我而言,我所有的类都有名为“ID”的主键

我创build了一个接口

 public class IID { public Int32 ID { get; set; } } 

然后我创build一个扩展方法

 public static Int32 GetNextID<T>(this ObjectSet<T> objects) where T : class, IID { T entry = objects.OrderByDescending(u => u.ID).FirstOrDefault(); if (entry == default(T)) return 1; return entry.ID + 1; } 

然后,当我需要一个新的ID,我只是这样做:

 MyObject myobj = new MyObject(); myobj.ID = entities.MyTable.GetNextID(); 

另一个选项是在具有标识列的表上使用SqlCeResultSet。

我有一个名为ID的数据types为INT32的主键,并具有标识列

只要做到这一点

MyEntity Entity = new MyEntity();

string命令;

('12/1/2014','Hello World',5); Entity.ExecuteStoreCommand(command);

– 在插入语句中排除主键

– 由于SQLCE不支持系统生成的密钥

– 不要使用LINQ,因为它为数据types为INT的主键提供默认值为0

Interesting Posts