6

我使用實體框架5 codefirst和2012年如何與實體框架播種數據時codefirst

我已經啓用遷移的SQL Server Express創建一個asp.net網站mvc4控制主鍵值,現在做到這一點的我的Configuration.Seed方法: (請注意,即使這是數據庫中的第一條記錄,我想將主鍵設置爲8)。

context.ProductCategoryDtoes.AddOrUpdate(x => x.Id, 
    new ProductCategoryDto() { Id = 8, Name = "category1" } 
); 

我的模型對象的定義如下:

[Table("ProductCategory")] 
public class ProductCategoryDto { 
    public long Id { get; set; } 
    public string Name { get; set; } 
} 

這導致表中(SQL SERVER EXPRESS 2012),其中Id列具有同一性=真,身份種子= 1,標識增量= 1

現在,當我做一個PM> Update-Database這一結果與編號= 1

所以我的問題是連續運行遷移:

1)在播種數據時如何控制自動遞增主鍵的值。

2)如果解決方案是增加鍵列的種子值,那麼當我使用Database.SetInitializer(new DropCreateDatabaseAlways<MyContext>());時如何完成此操作。這會在我每次更新數據庫時覈實和重建數據庫,那麼在新數據庫中如何更新種子值?

回答

2

只需創建虛擬實體的默認值,然後添加您的真實數據,然後刪除假人。不是最好的方式,但我想沒有其他的...

+0

是的,那是我最終做的。 –

0

看來你試圖打敗身份專欄的目的。如果你想這樣做,唯一的選擇是使用SQL命令Set IDENTITY_INSERT來允許你插入值,然後運行DBCC CHECKIDENT來更新種子。不是一個好主意。這些選項具有安全性和性能限制。

您可能需要考慮使用GUID。您可以在保證唯一的代碼中創建GUID,並且還可以在SQL中生成GUID作爲列默認值。

對於非順序的GUID,您需要思考一個好的索引策略。這種方法也是有爭議的。

最終,它看起來像你需要一個不同的策略,而不是使用標識列。

+0

我想控制ID,因爲我從一個MySql數據庫到SQL Server –

1

您是否嘗試過在你的id屬性的頂部添加此:

[DatabaseGenerated(DatabaseGeneratedOption.None)] 
public long Id { get; set; } 
+0

沒有遷移數據,但是這不會helpt我,因爲我還是想用標識(自動遞增),我只是想從另一個種子開始比0開始。 –

0

這是非常hackish,但我遇到了一個情況,我不得不這樣做,因爲一些報告具有硬編碼的PK值。修復報告超出了我的工作範圍。

Context.Database.ExecuteSqlCommand("SET IDENTITY_INSERT dbo.ProductCategoryDto ON " + 
    "INSERT INTO dbo.ProductCategoryDto (Id, Name) VALUES (8, 'category1') " + 
    "SET IDENTITY_INSERT dbo.ProductCategoryDto OFF");