2015-01-16 34 views
0

我有兩個班實體框架遷移種子重複的行

public class Category 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

public class Item 
{ 
    public int Id { get; set; } 
    public sting Name { get; set; } 
    public Category Category { get; set; } 
} 

我有EF遷移和下面的種子:

var instockCategory = new Category() { Name = "InStock" }; 
var outofStockCategory = new Category() { Name = "OutOfStock" }; 

context.Items.AddOrUpdate(
d => d.Name, 
new Item() { Name = "Item1", Category = instockCategory }, 
new Item() { Name = "Item2", Category = outofStockCategory }, 
new Item() { Name = "Item3", Category = outofStockCategory } 
); 

行 「d => d.Name」 確保根據項目的名稱,當我重新設置數據庫時不會有重複的記錄。 但是,我第一次執行此操作時,會創建兩個類別,分別爲ID 1和2。但是,第二次運行此類型時,會創建3個新類別! 我可以解決這個問題,而無需首先手動添加每個類別?

回答

2

您必須使用AddOrUpdate作爲您的類別。

var instockCategory = default(Category); 
var outofStockCategory = default(Category); 

context.Set<Category>().AddOrUpdate(
    c => c.Name, 
    instockCategory = new Category() { Name = "InStock" }, 
    outofStockCategory = new Category() { Name = "OutOfStock" } 
); 

context.Items.AddOrUpdate(
    d => d.Name, 
    new Item() { Name = "Item1", Category = instockCategory }, 
    new Item() { Name = "Item2", Category = outofStockCategory }, 
    new Item() { Name = "Item3", Category = outofStockCategory } 
); 

您的Context類的明確DbSet是沒有必要的。

public class Context : DbContext 
{ 
    public DbSet<Item> Items { get; set; } 
} 
+0

也許,但我不想,因爲那樣我就不得不添加一個類別DbSet,現在我沒有它。仍然可以這樣做,只是詢問是否有其他可能。 –

+0

@DennisvanderStelt做更新的答案幫助?你究竟用「添加類別DbSet」是什麼意思? –

+0

謝謝阿克塞爾,好電話關於集