使用自定义 ID 插入数据的 Code-First 实体框架

Posted

技术标签:

【中文标题】使用自定义 ID 插入数据的 Code-First 实体框架【英文标题】:Code-First Entity Framework inserting data with custom ID 【发布时间】:2012-10-04 13:20:02 【问题描述】:

我在我的项目中使用代码优先 EF,并在插入具有自定义 ID 的数据时遇到问题。

当我尝试插入具有自定义 ID(例如 999)的数据时,EF 会忽略它并将递增的 ID 插入到表中。

我的模特:

public class Address

        [Key]
        public int Id  get; set; 
        public string FirstName  get; set; 
...

如何解决这个问题?

编辑:

1) 如何从 N 开始递增,而不是从 0 开始?

2) 如果我不指定自定义 ID,DB 必须增加并插入自己的。如果我指定自定义 ID,DB 必须插入它。有可能吗?

【问题讨论】:

您要从整个表中删除自动增量功能吗? 不,我不知道。如果我不指定自定义 ID,DB 必须增加并插入自己的。如果我指定自定义 ID,DB 必须插入它。是否可以?是否可以从 N 开始递增,但不能从 0 开始? 【参考方案1】:

你可以使用以下属性

[Key, DatabaseGenerated(DatabaseGeneratedOption.None)]

在你的课程的关键或使用 fluentAPI

modelBuilder.Entity<Address>().Property(p => p.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

【讨论】:

感谢您的回答。是否可以使用 DatabaseGeneratedOption.Identity 并插入自定义 ID? 否,因为这将向 EF 表明您希望数据库为您生成 id,EF 将尽职尽责地忽略您在该字段上设置的任何值。【参考方案2】:

EF Core 中,您可以使用:

builder.Property(x => x.Id).ValueGeneratedNever();

[DatabaseGenerated(DatabaseGeneratedOption.None)]

【讨论】:

【参考方案3】:

它实际上在 DbContext 类中的 OnModelCreating 中。您可以设置序列号。通过在DbContext class 中添加以下内容,您可以随意开始和递增 请看这里例如:https://ef.readthedocs.io/en/staging/modeling/relational/sequences.html

  class MyContext : DbContext
    
        public DbSet<Order> Orders  get; set; 

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        
            modelBuilder.HasSequence<int>("OrderNumbers", schema: "shared")
                .StartsAt(1000)
                .IncrementsBy(5);

            //Once a sequence is introduced, you can use it to generate values for properties in your model. For example, you can use Default Values to insert the next value from the sequence.
            modelBuilder.Entity<Order>()
                .Property(o => o.OrderNo)
                .HasDefaultValueSql("NEXT VALUE FOR shared.OrderNumbers");
        
    

【讨论】:

以上是关于使用自定义 ID 插入数据的 Code-First 实体框架的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 EF Code-First 插入/更新可更新视图

如何使用 Entity Framework 4 Code-First 定义数据库视图?

EntityFramework Code-First 简易教程-------领域类配置之Fluent API

mybatis插入数据后返回自增主键ID详解

oracle 如何获得新插入记录的id

将我的 JSON 插入到集合中时,MongoDB 会覆盖我的自定义 id 属性吗?