多对多的关系问题

时间:2014-03-03 12:41:26

标签: linq entity-framework code-first eager-loading

我希望得到一些帮助。我有一个代码优先解决方案,有两个类Styles和QuantityBreaks。他们有多对多的关系,我相信我在下面列出的类定义中是正确的。我用一些数据将数据库播种到两个表中,创建了多对多表,但是没有数据,因为我还不确定如何向它添加数据。我可以手动完成,但是当我构建时会被删除。

所以我想我的第一个问题是我如何播种多对多表?

第二个问题是我如何查询StyleID所在的QuantityBreaks表1.我无法进行连接,因为两个表中都没有外键,或者我必须在三个表上进行连接表?我确实尝试使用.include语句,但发现非常令人沮丧,无法让它工作。我认为这应该很简单。

QuantityBreak类,虚拟ICollection为Style:

public class QuantityBreak
{
    [ScaffoldColumn(false)]
    public int QuantityBreakID { get; set; }

    [Required, Display(Name = "Press Type")]
    public PressType PressType { get; set; }

    [Display(Name = "Quantity")]
    public double? Quantity { get; set; }

    //Navigation Properties
    public virtual ICollection<Product> Products { get; set; }
    public virtual ICollection<Style> Styles { get; set; }
}

具有虚拟ICollection to QuantityBreaks的样式类:

public class Style
{
    [ScaffoldColumn(false)]
    public int StyleID { get; set; }

    [Required, StringLength(60), Display(Name = "Name")]
    public string StyleName { get; set; }

    [Required, StringLength(6), Display(Name = "Short Code (6)")]
    public string StyleCode { get; set; }

    [Display(Name = "Style Description")]
    public string Description { get; set; }

    public string ImagePath { get; set; }

    [Display(Name = "Image Width")]
    public int ImageWidth { get; set; }

    [Display(Name = "Image Height")]
    public int ImageHeight { get; set; }

    public int CategoryID { get; set; }

    public int SizeID { get; set; }

    //Navigation Properties
    public virtual Category Category { get; set; }
    public virtual Size Size { get; set; }
    public virtual ICollection<Stock> Stocks { get; set; }
    public virtual ICollection<QuantityBreak> QuantityBreaks { get; set; }
    public virtual ICollection<FinishConstraint> FinishConstraints { get; set; }
}

1 个答案:

答案 0 :(得分:1)

  

如何播种多对多表?

在多对多关联中,您必须向集合成员添加项目,如

var quantityBreak = db.QuantityBreaks.Create();
// .. set properties.
db.QuantityBreaks.AddOrUpdate(quantityBreak);

var style = db.Styles.Create();
// .. set properties.

// Add if StyleName is new, otherwise update
db.Styles.AddOrUpdate(s => s.StyleName, style);

// Make sure quantityBreak is attached 
// (AddOrUpdate does not attach exising entities)
if (db.Entry(quantityBreak).State != EntityState.Added)
    quantityBreak = db.QuantityBreaks.Find(quantityBreak.QuantityBreakID);

quantityBreak.Styles.Add(style)
d.SaveChanges();

如您所见,为了确保数据库中已存在的quantityBreak个实体附加到上下文,需要一些小技巧。不知何故,将其状态设置为Unchanged(这是附加实体的标准方法)会引发重复的键异常,即使实体未在该点附加。

  

如何查询StyleID为1的

的QuantityBreaks表

我想这意味着查询QuantityBreak至少有一个StyleID == 1的样式:

db.QuantityBreaks.Where(q => q.Styles.Any(s => s.StyleID == 1))

db是这些代码段中的上下文实例。