【问题标题】:Insert using a Sequence as generator for a Primary Key value in Entity Framework使用序列作为实体框架中主键值的生成器插入
【发布时间】:2015-06-23 00:30:51
【问题描述】:

我有一个如下所示的序列:

CREATE SEQUENCE dbo.NextWidgetId
 AS [bigint]
 START WITH 100
 INCREMENT BY 2
 NO CACHE 
GO

还有一个看起来像这样的表格:

CREATE TABLE [dbo].[Widget_Sequenced]
(
    [WidgetId] [int] NOT NULL DEFAULT(NEXT VALUE FOR dbo.NextWidgetId),
    [WidgetCost] [money] NOT NULL,
    [WidgetName] [varchar](50) NOT NULL,
    [WidgetCode] [int] NOT NULL,
    [LastChangedBy] [int] NOT NULL,
    [RowVersionId] [timestamp] NOT NULL,

    CONSTRAINT [PK_Widget_Sequenced] 
    PRIMARY KEY CLUSTERED ([WidgetId] ASC) ON [PRIMARY]
) ON [PRIMARY]

有没有办法使用实体框架向这个表结构添加新记录?

我尝试将StoreGeneratedPatternWidgetId 设置为computed,并尝试使用Identity。两者都给了我错误。

我在 EF 5 上试过这个。但如果它解决了这个问题,我可以迁移到 EF 6。

【问题讨论】:

    标签: sql-server entity-framework sql-server-2012 tsql-sequence


    【解决方案1】:

    从 6.2 版开始,可以使用以下代码:

    System.Data.Entity.SqlServer.SqlProviderServices.UseScopeIdentity = false;

    更多关于EF6 does not work with primary key from sequence的信息

    【讨论】:

    • 在哪里设置这个值?表示 SEQUENCE 列的字段需要什么属性?
    【解决方案2】:

    您可以用 IDENTITY(100, 2) 替换您的序列,一切都可以开箱即用。

    【讨论】:

    • 嗯,这是在回避问题,而不是解决问题。是的,据我所知,IDENTITY(100, 2) 的工作方式类似于这个特定的SEQUENCE,除了IDENTITY 没有NO CACHE 选项。此外,此SEQUENCE 对象可用于其他表以跨多个表生成单个序列 - 您无法使用IDENTITY 轻松复制此行为。
    • 据我所知,NOCACHE 选项用于缓解索引中的空白。但是documentation 说“如果使用 NEXT VALUE FOR 请求数字,仍然会出现差距”。
    • 谢谢。我有一个身份,并且正在转向一个序列。我需要能够更新该值(以使其移动分区)。
    猜你喜欢
    • 2018-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多