2014-11-15 192 views
0

我已經被稱爲「購物車」的表格,其中有2個值的複合鍵:生成唯一的ID(實體框架)

public class Cart 
{ 
    [Column(Order=0), Key] 
    public int Id { get; set; } 

    [Column(Order=1), Key] 
    public int ProductId { get; set; } 

    public int Quantity { get; set; } 

} 

所以,如「購物車」的相同ids可以有不同的ProductIds(一個購物車上有不同的產品)。由於這個Cart Id列不是唯一的,我不能使用DatabaseGeneratedOption.Identity屬性來要求EF創建唯一的ID。

當我將新購物車實體插入數據庫並重復購物車中的產品時,是否可以要求EF僅生成一次新的唯一標識並返回服務器?

int unqiueId = ??(dbcontext.Generate Unique ID For This Table) 
foreach (var cartLine in cart.CartLines) 
     { 
      Cart cartLinePurchased = new Cart{ 
       Id = uniqueId, 
       ProductId=cartLine.Product.Id, 
       Quantity=cartLine.Quantity 
      }; 
      dbcontext.CartPurchased.Add(cartLinePurchased); 
      dbcontext.SaveChanges(); 
      cartPurchased = cartLinePurchased; 
     } 

在此先感謝。

+0

具有相同'Id'的多行有什麼作用? –

+0

同一個Id表示同一個Cart。一個購物車(一個唯一的ID)與其上的不同產品。例如Id = 1的購物車上有1,2,3,4,5個產品ID; Id = 2的購物車,上面有3,5,7,8個產品ID;這就是爲什麼我創建了複合鍵。 –

+2

如何使用Guid代替?或者有一個單獨的購物車表,這將負責給你這些獨特的數字? –

回答

2

第一:EF無法創建複合鍵唯一值。請,see this SO answer

第二:你的數據庫是非規範化的。你需要規範化它。有一種車能有幾個產品,然後:

  • 你需要一個cart表,其中有車ID(可以是單人PK,使用的身份由DB產生的,這是由EF支持) 。此購物車只能有直接與購物車相關的數據(例如購物車的編號,客戶的編號,購物車的創建日期...)
  • 您需要一個productInCart表,該表包含購物車的所有產品。該表必須具有FK,其使用cart id將productInCart的每一行與對應的購物車相關聯。這個可以有,關係到產品在車同類產品,數量,單價,總價數據...

您可以參閱瞭解database normalization

事情會變得,如果你很容易這樣做。如果不是這樣,除了每行的PK代之外,你會遇到很多麻煩。