生成唯一ID(实体框架)

时间:2014-11-15 21:03:55

标签: c# sql entity-framework guid

我有一个名为“Cart”的表,其中包含2个值的复合键:

 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(一个购物车上有不同的产品)。由于此商品Id列不是唯一的,我无法使用DatabaseGeneratedOption.Identity属性来要求EF创建唯一的ID。

当我将新购物车实体插入数据库并遍历购物车中的产品时,是否可以要求EF仅生成一次新的唯一ID并返回服务器?

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;
        }

提前致谢。

1 个答案:

答案 0 :(得分:2)

首先:EF无法创建复合键唯一值。请see this SO answer

第二:您的数据库是非规范化的。你需要规范它。有一个购物车可以有几种产品,然后:

  • 您需要一个cart表,其中包含购物车ID(可以是单个PK,由DB使用标识生成,EF支持)。此购物车必须只有与购物车直接相关的数据(例如购物车的ID,客户的ID,购物车的创建日期......)
  • 您需要一张productInCart表格,其中包含购物车的所有商品。此表必须具有FK,该FK使用productInCart ID将cart的每一行与相应的购物车相关联。这可能包含与购物车中的产品相关的数据,如产品,数量,单价,总价......

您可以阅读此内容以了解database normalization

如果你这样做,事情会变得容易多了。如果不是,你会遇到很多麻烦,除了每行PK的产生。