1

我正在使用C#4.5.1和實體框架6.1.3。如何插入帶有我的ID的對象?

我需要做的是我想插入我的對象的主要ID鍵,如; 1-3-5-7-9-11-13-15等...

我不想使用自動增量功能插入它們。

贊;

 public static void SeedCategories(DataContext context) 
    { 
     context.Categories.AddOrUpdate(new Category 
     { 
      Id = 1, 
      Name = "Haber", 
      IsActive = true 
     }); 

     context.SaveChanges(); 

     context.Categories.AddOrUpdate(new Category 
             { 
              Id = 5, 
              Name = "Basic", 
              ParentId = 1, 
              IsActive = true 
             }, 
             new Category 
             { 
              Id = 7, 
              Name = "Medium", 
              ParentId = 1, 
              IsActive = true 
             }, 
             new Category 
             { 
              Id = 9, 
              Name = "Pro", 
              ParentId = 1, 
              IsActive = true 
             }, 
             new Category 
             { 
              Id = 11, 
              Name = "Advanced", 
              ParentId = 1, 
              IsActive = true 
             }, 
             new Category 
             { 
              Id = 13, 
              Name = "Ultimate", 
              ParentId = 1, 
              IsActive = true 
             } 
      ); 

     context.SaveChanges(); 
    } 

但實體框架插入所有這些對象像;

  • ID = 1,名稱=哈伯
  • ID = 2,名稱=基本
  • ID = 3,名稱=中
  • ID = 4,名稱=臨

所以我需要你的幫助...

@Update:爲什麼我需要這個?我們正在將舊數據庫遷移到新數據庫。但對於業務需求,某些屬性和類別將不會在新數據庫中使用。例如,如果category屬性isActive = false。所以我只採取isActive =真正的。總結:我有類似id = 3,(id = 4 isActive = false),id = 5,id = 33,id = 410等類別的列表。

+0

你可以只關閉自動增量,使用DatabaseGeneratedOption.None? – DevilSuichiro

+0

確保您的類別表沒有定義**自動遞增**主鍵。這將允許您定義自己的值。或者,您可以將Identity Increment設置爲2而不是1,這應該跳過其他所有項。 (假設MSSQL) –

+0

@DevilSuichiro,我試圖將這個數據註解(DatabaseGeneratedOption.None)添加到我的通用T Id {get; set;}屬性中。但它仍然會自動增加它。我錯過了什麼,我不知道。 –

回答

1

不確定它是否可以作爲代碼使用實體框架或在Visual Studio中,但我相信它在SQL Server Management Studio中是可行的。您可以在SQL Server Management Studio中更改主鍵的標識規範。如果您將Identity Increment值設置爲2,那麼Identity種子值爲1,我會認爲您最終會得到您想要的結果,而無需在代碼中指定ID值。

如果您必須使用實體框架代碼來完成此操作,那麼您是否沒有方法/屬性可用於使您能夠手動指定主鍵?類似於SQL Server中的「SET IDENTITY_INSERT」命令?

1

如果這是永久性的,請使用上面的註釋。如果僅用於播種,請參閱此答案:How do I temporarily turn off an IDENTITY column in EF Code First?

編輯:對不起,這是我的頭頂。我使用的實際工作代碼被編輯。

我去這樣的代碼:

if (!dataContext.Categories.Any()) 
{ 
var sqlInsert = @"SET IDENTITY_INSERT [dbo].[Category] ON; 
    INSERT INTO Category (Id, Name, ParentId, IsActive) VALUES (5, 'Basic', 1, 1); 
    INSERT INTO Category (Id, Name, ParentId, IsActive) VALUES (7, 'Medium', 1, 1); 
    SET IDENTITY_INSERT [dbo].[Category] OFF;"; 
    dataContext.Database.ExecuteSqlCommand(sqlInsert); 
} 
+0

這是行不通的,因爲Identity_Insert只適用於當前事務和EF在自己的事務中包裝每一個命令。 – DevilSuichiro

+0

這不適合播種。但是你的代碼給了我一個主意。我可以進行字符串處理並直接執行sql命令以在db中創建行。 –

+0

@DevilSuichiro你確定嗎?我會試試這個,但是如果我們使用了我的sql命令,那麼它將不會使用然後... –

相關問題