我希望得到一些帮助。我有一个代码优先解决方案,有两个类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; }
}
答案 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
是这些代码段中的上下文实例。