自定义关系表中的多对多关系

时间:2015-05-05 21:04:35

标签: c# entity-framework

所以,我正在编写一个电子商务应用程序,我正在尝试在ProductSize类之间创建多对多的关系。实体看起来像这样:

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public decimal Price { get; set; }
}

public class Size
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class ProductSize
{
    public int Id { get; set; }
    public int ProductId { get; set; }
    public int SizeId { get; set; }
    public string Amount { get; set; }

    public virtual Size Size { get; set; }
    public virtual Product Product { get; set; }
}

通常我不会显式创建这个ProductSize表,因为EF会为我创建它。但是,我需要Amount列才能坐在那里。现在,为了获取有关大小和数量的产品的信息,我必须创建一个非常明确的查询(2个连接)。如果我没有手动创建关系类,只给ProductICollection Size,那么获取完整信息只是一件简单的事情。因此,如果我选择了Product个实例,那么所有大小都会被加载到virtual ICollection<Size>中。

问题是 - 我可以使用上面给出的实体结构实现相同的简单性吗?而不是编写一个2连接查询,我明确提到我想要的每一列,然后将其打包成一些ViewModel我想使用更简单的语法来获取Product实例及其相关数据(所以坐在中间表中的数据也是如此。

1 个答案:

答案 0 :(得分:1)

ProductSizeProductSize添加Inverse Navigation Property,如下所示:

public class Product {
    public int Id { get; set; }
    public string Name { get; set; }
    public decimal Price { get; set; }

    public virtual ICollection<ProductSize> ProductSizes { get; set; }
}

public class Size {
    public int Id { get; set; }
    public string Name { get; set; }

    public virtual ICollection<ProductSize> ProductSizes { get; set; }
}

public class ProductSize {
    public int Id { get; set; }
    public int ProductId { get; set; }
    public int SizeId { get; set; }
    public string Amount { get; set; }

    public virtual Size Size { get; set; }
    public virtual Product Product { get; set; }
}

这样做,您应该能够在以下示例中执行此操作:

from p in Context.Products
where p.ProductSizes.Where(ps => ps.Amount > 0 && ps.Size.Name.Equals("Big")).Any()
select p;