EF中多对多连接的最佳实践

Joh*_*ohn 1 c# many-to-many entity-framework-4

实体框架中多对多连接的最佳解决方案是什么.看起来在我们在将表添加到edmx文件后使用EF的一个项目中,它忽略了添加交集实体,即:

有了这些表格

Customer(CustomerId,...)
CustomerOrder(CustomerId,OrderId)
Order(OrderId,...)
Run Code Online (Sandbox Code Playgroud)

CustomerOrder表没有添加到edmx中,因此表格无法与传统的(传统意义,我们在LINQ to SQL中执行它的方式)内连接查询连接,例如

var q = from c in db.Customers
        join co in db.CustomerOrders on c.CustomerId equals co.CustomerId
        join o in db.Orders on co.OrderId equals o.OrderId
        select a;
Run Code Online (Sandbox Code Playgroud)

据我所知,通过查看先前提出的问题,您可以通过在where子句中指定条件来进行多次选择和"连接",或者使用intersects关键字.但我想知道这些情况的最佳做法是什么.

假设我想知道客户有哪些订单,我将如何编写该查询.

Eri*_*ips 5

只是为了澄清,当添加两个表时,连接表不是edmx的一部分,除非它包含的不仅仅是连接表ID.在EF 决定不将连接表用作实体的情况下,每个其他表具有导航属性(Orders将具有ICollection<Customer> CustomersCustomers将要具有ICollection<Orders>),这些属性允许访问连接表而无需手动连接它们.在那种情况下,您将能够执行以下操作:

var customer = dbContext.Customers.Include("Orders")
                                  .Where(o => o.Orders.OrderID == 2);
Run Code Online (Sandbox Code Playgroud)

通常,导航属性是延迟加载的,其中对象在代码访问之前不在实体的属性中.如果您知道要使用Include方法使用它们,可以手动告诉框架立即加载它们.此示例中的此方法不是必需的,以便访问该Orders.OrderID值.