2012-10-04 46 views
7

當我插入自定義ID的數據時,我在我的項目中使用了代碼優先的EF和麪對問題。用自定義ID插入數據的代碼優先實體框架

當我試圖插入具有自定義ID(例如999)的數據時,EF忽略它並將增加的ID插入到表中。

我的模型:

public class Address 
{ 
     [Key] 
     public int Id { get; set; } 
     public string FirstName { get; set; } 
... 
} 

如何解決這個probleb?

編輯:

1)如何開始從N個遞增的,而不是從0?

2)如果我沒有指定自定義ID,DB必須增加並插入自己的ID。如果我指定自定義ID,則數據庫必須插入它。可能嗎?

+0

你想整體從表中刪除自動增量功能? –

+0

不,我不知道。如果我不指定自定義ID,則數據庫必須增加並插入自己的ID。如果我指定自定義ID,則數據庫必須插入它。可能嗎? 是否可以從N開始遞增,但不能從0開始遞增? –

回答

19

您可以使用下面的屬性

[Key, DatabaseGenerated(DatabaseGeneratedOption.None)] 

的關鍵是你的類或使用fluentAPI

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

感謝您的回答。是否可以使用DatabaseGeneratedOption.Identity並插入自定義ID? –

+0

否,因爲它會向EF表明您希望數據庫爲您生成ID,EF將盡職盡責地忽略您在該字段上設置的任何值。 – JTMon

+0

很明顯,謝謝 –

0

它實際上是在OnModelCreatingDbContext類。您可以設置序列號。從開始和incrementBy,請你通過添加在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"); 
     } 
    }