如何使用 LINQ 将对象集合映射到 SQL
本文关键字:映射 SQL 集合 对象 何使用 LINQ | 更新日期: 2023-09-27 18:33:59
我正在做一些测试,以体验使用 LINQ 到 SQL 的对象关系映射,并且我遇到了尝试使多对多关系正常工作的问题。为简单起见,假设我有一个 Order 类,该类拥有已订购产品的集合。如何使用 LINQ 将此产品集合映射到 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 作为容器来保存订单的产品,但它不起作用,因为 LINQ 查询返回具有空产品集合的 Order 对象。
PS:从这个问题来看,我似乎需要创建一个第三个类来跟踪订单-产品关系,但我希望找到一种方法来做到这一点,而不必创建另一个类。
除了 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);
}
}
}
正如@TheEvilPenguin指出的,
- LINQ-to-SQL 将类映射到表
- 您需要一个 OrderProduct 表来促进数据库中的这种多对多关系
- 因此,LINQ to-SQL 也需要映射该表。
将该联接表拖到设计器上。您将在Order
上拥有一个名为 OrderProduct
的属性,并且您将能够通过 OrderProducts
属性导航到Order
上的Products
foreach (var op in Order.OrderProducts)
{
var product = op.Product;
}