在 SQL Server Compact Edition 中将实体框架代码中的主键首先播种为 0

Posted

技术标签:

【中文标题】在 SQL Server Compact Edition 中将实体框架代码中的主键首先播种为 0【英文标题】:Seed primary key in Entity Framework code first to 0 in SQL Server Compact Edition 【发布时间】:2016-10-21 15:15:06 【问题描述】:

我有这个实体框架代码第一类:

public class ClientEvent

    [Key]
    public int? EventCode  get; set; 
    public string Description  get; set; 

使用 SQL Server Compact Edition 的这个种子函数:

protected override void Seed(ClientEventsContext context)

    var clientEvent = new ClientEvent
    
        EventCode = 0,
        Description = "Test"
    ;
    context.Events.Add(clientEvent);
    base.Seed(context);

当我在 ClientEvent 运行后检查数据库表时,我看到了这个条目:

EventCode   |   Description
---------------------------
1           |   Test

注意 EventCode 是 1 吗?我希望它是 0。我怎样才能让这个主键从 0 开始?我已经尝试使用上面的代码,但即使使用 0 本身也会将第一个条目设置为 1。

There is another question similar to this which works for SQL Server, but not SQL Server Compact Edition。我尝试使用其建议的答案将初始化程序设置为 0:

context.Database.ExecuteSqlCommand("DBCC CHECKIDENT ('ClientEvents', RESEED, 0)");

这个问题是:

System.Data.SqlServerCe.SqlCeException:解析时出错 询问。 [令牌行号=1,令牌行偏移量=1,错误令牌= DBCC ]

是否没有一种标准方法可以首先使用实体​​框架代码执行此操作,与所使用的数据库类型无关?

【问题讨论】:

【参考方案1】:

您可以将此语句与 SQL Server Compact 一起使用:

ALTER TABLE [MyTable] ALTER COLUMN [Id] IDENTITY (0,1)

【讨论】:

这很好,但唯一的问题是它与所使用的数据库类型无关。此命令在 SQL Server(非紧凑型)上失败,Incorrect syntax near the keyword IDENTITY. 遗憾的是没有通用的方法 我不这么认为,太糟糕了。我想我只需要try-catch 两个命令,如果两者都失败则抛出某种类型的异常。 您也可以通过查看context.Database.Connection erikej.blogspot.dk/2013/06/…的类型来查看您使用的数据库。

以上是关于在 SQL Server Compact Edition 中将实体框架代码中的主键首先播种为 0的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 SQL Server Management Studio (2008) 在 SQL Server Compact Edition 中创建列

从使用 SQL Server Express 切换到 SQL Server Compact

在 SQL Server Compact 中返回标识

SQL Server Compact - 架构管理

使用 SQL Server Compact 与专用 SQL Server 数据库的缺点

SQL Server 2008 到 SQL Server Compact Edition?