首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >您能用实体框架6从主键中删除标识吗?

您能用实体框架6从主键中删除标识吗?
EN

Stack Overflow用户
提问于 2017-12-04 10:13:01
回答 6查看 12K关注 0票数 9

我通过实体框架代码创建了一个表--首先将主键设置为自动增量,但现在我想从列中删除该自动增量。我试过用这两种fluent API来实现这一点:

代码语言:javascript
复制
    public class ProductTypeMap: EntityTypeConfiguration<ProductType>
    {
        public ProductTypeMap()
        {
            // This is an enum effectively, so we need fixed IDs
            Property(x => x.ProductTypeId)
                .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
        }

    }

还有一个注释:

代码语言:javascript
复制
    public class ProductType
    {
        [Required, Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
        public int ProductTypeId { get; set; }
        public string ProductTypeName { get; set; }

    }

在这两种情况下,它们生成相同的迁移代码:

代码语言:javascript
复制
    public partial class removeproducttypeidentity : DbMigration
    {
        public override void Up()
        {
            DropPrimaryKey("dbo.ProductTypes");
            AlterColumn("dbo.ProductTypes", "ProductTypeId", c => c.Int(nullable: false));
            AddPrimaryKey("dbo.ProductTypes", "ProductTypeId");
        }
        
        public override void Down()
        {
            DropPrimaryKey("dbo.ProductTypes");
            AlterColumn("dbo.ProductTypes", "ProductTypeId", c => c.Int(nullable: false, identity: true));
            AddPrimaryKey("dbo.ProductTypes", "ProductTypeId");
        }
    }

但是,当我在数据库上运行迁移时,身份规范不会从Server 2008数据库表中删除吗?

我还试图显式地关闭迁移中的标识,如下所示,但也没有做到这一点:

代码语言:javascript
复制
AlterColumn("dbo.ProductTypes", "ProductTypeId", c => c.Int(nullable: false, identity: false));

还有其他方法可以告诉SQL删除标识吗?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2017-12-04 10:50:12

不能使用ALTER COLUMN设置列是否是标识列(如何将列更改为标识(1,1))。

相反,你必须:

  • (后备数据库)
  • 带有原始表列的CREATE TMP_table,但ID列设置为identity: false
  • SET IDENTITY_INSERT [TMP_Table] ON
  • 将数据从原始复制到TMP表
  • SET IDENTITY_INSERT [TMP_Table] OFF
  • DROP原始表
  • 将TMP_table重命名为原始表名(EXECUTE sp_rename)

提示:更改Studio中的列并检查发出的脚本(SQL SERVER -在列上添加或删除标识属性)。

票数 3
EN

Stack Overflow用户

发布于 2018-05-08 18:15:49

就像其他人说的那样,EF无法在本地完成这一任务,尽管它将创建一个迁移脚本,使其看起来像是迁移脚本。我尝试过很多方法,我发现最简单的方法是:

  1. 备份数据库..。
  2. 更改类,使其不再具有代码中的标识(通过删除属性或映射)
  3. 使用Package控制台(add-migration [your migration name] )生成迁移
  4. 在新生成的迁移中注释掉Up方法中的代码
  5. 添加一行新代码,可以接收下面生成的SQL:Sql (@" ");
  6. 进入SSMS,并确保在进行表更改时将其设置为生成脚本
  7. 移除SMSS中表设计器中的标识
  8. 将表更改保存在SSMS中,并复制生成的SQL。( SQL与数据一起复制表,删除原始表,然后在列上没有设置标识的情况下重新创建原始表,然后将所有数据复制回来,并再次添加所有外键和约束)
  9. 粘贴刚才在上面添加的代码中的语音标记之间复制的SQL。
  10. 运行迁移

这将为您提供一个移除标识的迁移,并且可以成功地在数据库的其他副本上运行。

注意:生成的Down方法也不能工作,因为它将重新添加标识,EF也做不到。如果需要使用Down方法,请创建所添加的SQL的副本,并对其进行调整以再次创建带有标识的表。

上面的方法是@在他的回答中描述得那么好的一种快速方式。

票数 6
EN

Stack Overflow用户

发布于 2021-11-18 19:25:39

如果你想要删除身份,你需要

步骤1.键列的注释

代码语言:javascript
复制
[DatabaseGenerated(DatabaseGeneratedOption.None)]

public short Id { get; set; }

这将生成迁移脚本。

代码语言:javascript
复制
AlterColumn("dbo.TableName", "Id", c => c.Long(nullable: false));

但是这个脚本不会从键列中删除标识。

步骤2.从中的键列手动删除标识。你不需要备份数据库。

如果遇到错误,可能需要转到“Tools”->“选项”“->”Designers,并取消选中“防止需要重新创建表的保存更改”。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47630971

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档