1

我正在做一些测试来体验使用 LINQ to SQL 的对象关系映射,但我一直在尝试使多对多关系工作。为了简单起见,假设我有一个Order类,它拥有一个有序Products的集合。如何使用 LINQ to SQL 映射此产品集合?

[Table(Name = "OrderTable")]
public class Order
{
    [Column(IsPrimaryKey = true, IsDbGenerated = true)]
    public int ID;

    [Column]
    public string Customer;

    [Association(ThisKey = "ID", OtherKey = "ID")] // Not working
    public EntitySet<Product> products = new EntitySet<Product>();
}

[Table(Name = "ProductTable")]
public class Product
{
    [Column(IsPrimaryKey = true, IsDbGenerated = true)]
    public int ID;

    [Column]
    public string Name;

    [Column]
    public double Price;
}

我尝试使用EntitySet作为容器来保存OrderProducts但它不起作用,因为 LINQ 查询返回带有空产品集合的Order对象。

PS:从这个问题看来,我需要创建第三个类来跟踪订单-产品关系,但我希望找到一种无需创建另一个类的方法。

4

2 回答 2

3

除了 Order-Product 表之外,没有其他方法可以在数据库中对此进行建模,并且 Linq-to-SQL 实体与 SQL 表相匹配。不幸的是,这是使用 Linq-to-SQL 建模的唯一方法(据我所知)。

创建模型后,您可以创建一个属性来隐藏此限制,方法是右键单击实体并选择查看代码(假设为 DBML 设计器,否则只需将其添加到代码中),然后添加如下内容:

public partial class Order
{
    public IEnumerable<Product> Products
    {
        get
        {
            return OrderProducts.Select(op => op.Product);
        }
    }
}
于 2012-05-14T00:48:19.500 回答
0

正如@TheEvilPenguin 指出的那样,

  • LINQ-to-SQL 将类映射到表
  • 您需要一个 OrderProduct 表来促进数据库中的这种多对多关系
  • 因此,LINQ-to-SQL 也需要映射该表。

将该连接表拖到设计器上。您将在Ordernamed上拥有一个属性OrderProduct,并且您将能够通过该属性导航到ProductsonOrderOrderProducts

foreach (var op in Order.OrderProducts)
{
    var product = op.Product;
}
于 2012-05-14T01:24:29.467 回答