Entity framework 首先映射EF 4.1代码中的关联表

Entity framework 首先映射EF 4.1代码中的关联表,entity-framework,ado.net,entity-framework-4.1,Entity Framework,Ado.net,Entity Framework 4.1,我不确定如何首先在EF 4.1 code中映射下表,以及我需要哪些对象来表示这些表。如何检索产品规格列表 我目前只有产品类 Products Table: Id Name IsActive ProductSpecification Table: ProductId SpecificationId Specifications Table: Id Name IsActive ProductSpecifications是一个关联表。在我的上下文类中还定义了以下内容: public DbSet&

我不确定如何首先在
EF 4.1 code中映射下表,以及我需要哪些对象来表示这些表。如何检索产品规格列表

我目前只有
产品

Products Table:
Id
Name
IsActive

ProductSpecification Table:
ProductId
SpecificationId

Specifications Table:
Id
Name
IsActive
ProductSpecifications
是一个关联表。在我的上下文类中还定义了以下内容:

public DbSet<Product> Products { get; set; }
我的
产品类别
(部分):

这就是我从Slauma的回答中所做的一切。我没有像他说的那样手动进行映射,但我首先需要了解以下内容:

public DbSet<Product> Products { get; set; }
public DbSet<Specification> Specifications { get; set; }
public Product GetById(int id)
{
     return db.Products
          .Include("Specifications")
          .SingleOrDefault(x => x.Id == id);
}
var specificationsOfProduct = context.Products
    .Where(p => p.ProductId == givenProductId)
    .Select(p => p.Specifications)
    .SingleOrDefault();
鉴于我上面的类和表,EF 4.1命名约定具体说明了它如何处理关联表?我之所以询问,是因为我的GetById方法中出现以下错误:

Invalid object name 'dbo.SpecificationProducts'.
编辑2


我忘了提到以下几点:)一个产品可以有一个规格高度作为价值。对于这个高度,我需要指定一个值。大约100英寸。因此,我修改了ProductSpecifications表,使其具有一个名为
SpecificationValue
的值列,该列将包含100英寸的值。我如何修改代码来检索这个值呢?我需要在视图上显示它。

在多对多关系中,您只为要关联的实体定义类,而不是为关联表定义实体。此表在模型中“隐藏”,并由实体框架自动管理。因此,您可以定义这些类:

public class Product
{
    public int ProductId { get; set; }
    public string Name { get; set; }

    public ICollection<Specification> Specifications { get; set; }
}

public class Specification
{
    public int SpecificationId { get; set; }
    public string Name { get; set; }

    public ICollection<Product> Products { get; set; }
}
这将加载产品和规格。如果您只需要给定产品id的规格,可以使用以下选项:

public DbSet<Product> Products { get; set; }
public DbSet<Specification> Specifications { get; set; }
public Product GetById(int id)
{
     return db.Products
          .Include("Specifications")
          .SingleOrDefault(x => x.Id == id);
}
var specificationsOfProduct = context.Products
    .Where(p => p.ProductId == givenProductId)
    .Select(p => p.Specifications)
    .SingleOrDefault();
…返回一组规范

编辑2

EF代码的命名约定首先将假定连接表的名称是由两个相关类名组合而成的,然后将其复数化。因此,如果没有表名
ProductSpecification
EF的显式映射,它将假定
ProductSpecifications
(复数)并以该名称作为表名构建查询。由于数据库中不存在此表,因此在运行查询时会出现异常“无效对象名称'dbo.SpecificationProducts'。”。因此,必须重命名数据库中的表或使用上面的映射代码

编辑3


我强烈建议在任何情况下都使用显式映射,因为联接表名为EF。通过更改这些集合的顺序,联接表可以是
SpecificationProducts
。如果没有到固定表名的显式映射,在上下文中交换集合(通常不重要)可能会中断您的工作应用程序。

这种“我忘了提及”应该被视为“不受欢迎”。有人花时间回答你的问题,然后你把“我忘了提”放进去,改变问题的形状,这样答案和花在答案上的时间就不值得尊重了。如果你忘了提到某件事,接受这个问题的答案,然后问一个新的关于这个问题的答案。拉迪斯拉夫是对的。你的编辑2使这成为一个全新的问题。您现在可以忘记我的答案中的所有内容,从头开始映射,因为修改后的联接表使多对多关系变得不可能。最好问一个新问题,或者看看这里,如果有帮助的话:酷家伙。我会问一个新问题。我真的忘了问。这是最初问题的一部分:)
var specificationsOfProduct = context.Products
    .Where(p => p.ProductId == givenProductId)
    .Select(p => p.Specifications)
    .SingleOrDefault();