我有一个名为“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;
}
提前致谢。
答案 0 :(得分:2)
首先:EF无法创建复合键唯一值。请see this SO answer。
第二:您的数据库是非规范化的。你需要规范它。有一个购物车可以有几种产品,然后:
cart
表,其中包含购物车ID(可以是单个PK,由DB使用标识生成,EF支持)。此购物车必须只有与购物车直接相关的数据(例如购物车的ID,客户的ID,购物车的创建日期......)productInCart
表格,其中包含购物车的所有商品。此表必须具有FK,该FK使用productInCart
ID将cart
的每一行与相应的购物车相关联。这可能包含与购物车中的产品相关的数据,如产品,数量,单价,总价...... 您可以阅读此内容以了解database normalization
如果你这样做,事情会变得容易多了。如果不是,你会遇到很多麻烦,除了每行PK的产生。