【问题标题】:Entity framework code first, shopping cart实体框架代码先,购物车
【发布时间】:2015-01-13 05:12:11
【问题描述】:

我是实体框架的新手,我试图使用代码优先的方法实现一个简单的购物车,但我不明白为什么实体会以下面奇怪的方式生成表格。这是我的课程的精简版:

产品.cs

public class Product 
{
[Key]
public int ID { get; set; } 
public int ProductCategoryID { get; set; } 
public string ProductNumber { get; set; } 
public string Name { get; set; } 
public string Description { get; set; } 
public string Specification { get; set; } 
public string Color { get; set; } 
public string Capacity { get; set; } 
public string CapacityUnitMeasureCode { get; set; }
public decimal Price { get; set; }
public decimal Cost { get; set; }
public int Stock { get; set; } 
}

ShoppingCart.cs

public class ShoppingCart
{ 
    [Key] 
    [Column (Order=1)]
    public int ID { get; set; }

    [Key]
    [Column(Order = 2)]
    public int ProductID { get; set; }

    public int Quantity { get; set; }
    public DateTime CreatedDate { get; set; } 

    public virtual List<Product> products { get; set; } 
}

因为这条线 公共虚拟列表产品{获取;放; } 实体生成带有 2 个附加外键的 Product 表: ShoppingCart_ID & ShoppingCart_ProductID

我不明白。我的目的是创建一个与特定购物车关联的产品列表。我在做什么我做错了。有人可以解释一下吗!

【问题讨论】:

  • 首先,这一行“public int ProductID {get; set;}”不应该在 ShoppingCart 类定义中。删除它,看看会发生什么。其次,我希望有一个额外的表来保持购物车及其相关产品之间的关系。
  • 这似乎解决了我的问题。将“public virtual List products { get; set; }”替换为“public virtual Product Product { get; set; }”,这似乎更正了 ProductID 上的 FK 约束。而不是在 Product 表上添加其他键。 - 谢谢大家
  • 我认为虽然这解决了您的问题,但它不会是您想要的设计。因为一个购物车可能包含多个产品。而且一个产品可以在不同的购物卡中,是多对多的关系。您需要一个额外的表格来反映这种关系
  • @Eric。实际上它应该可以工作,如您所见,ShoppingCart 类有一个复合 PK(ID,ProductID),而 ID 是 CardID,也是客户表的 FK。所以 yes 没有完全标准化,但是由于购物车项目来来去去(提交订单时)。所以我认为这不是问题。 - 感谢您的意见

标签: c# entity-framework


【解决方案1】:

由于您将 ProductID 作为购物车类中的属性之一,并且您在购物车中具有虚拟产品集合,因此 EF 在购物车和产品类之间建立了关系。

按照评论中的建议,您可以删除产品 id 类,或者您可以创建一个视图模型类并在购物车和产品类之间建立关系。

Sample View 模型可以是

public class ShoppingCartProduct
{ 
    [Key] 
    [Column (Order=1)]
    public int ID { get; set; }

    [Key]
    [Column(Order = 2)]
    public int ProductID { get; set; }
}

您可以在此处阅读有关视图模型的信息

http://www.google.co.in/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0CB4QFjAA&url=http%3A%2F%2Frachelappel.com%2Fuse-viewmodels-to-manage-data-amp-organize-code-in-asp.net-mvc-applications&ei=EP20VNqDHcTkuQTqvYGoAw&usg=AFQjCNHdOjOFhZGuBiLHZJ0wBGsG9qQtXw&sig2=rSFNWzWstWP0z0yRDhuXXQ

【讨论】:

    【解决方案2】:

    对您来说最好的解决方案是创建一个 ShopingCart 类,其中包含您所有的产品及其编号:

    [Table("Cart")]
    public class ShopingCart
    {
       [Key]
       public int Id { get; set; }
    
       public DateTime CreatedDate { get; set; }
    
       public virtual ICollection<ItemCart> Products { get; set; } // relationship one-to-many
    }
    

    包含你的ItemCart的类

    [Table("ItemCart")]
    public class ItemCart
    {
       [Key]
       public int Id { get; set; } 
    
       public int Quantity { get; set; }
       public virtual Product Product { get; set; } // relationship one-to-one
    }
    

    如果您想了解更多信息,请查看此页面:entity-tutorial

    并尽量简化:您只有 3 种可能的关系:

    1. 一对一
    2. 一对多
    3. 多对多,但这里正在创建一个间歇性表link

    希望对你有用!

    【讨论】:

      猜你喜欢
      • 2012-09-22
      • 1970-01-01
      • 2016-04-09
      • 2017-09-01
      • 2014-05-23
      • 2017-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多