2012-08-23 66 views
1

我想在EF4中关联两个实体类型,没有外键可用。没有外键的关联

是否有任何手动调整我可以做,所以当我打开的顺序一个实例,我得到这样的:

order.orderID = 455 
order.date = 2012-08-12 
order.OrderItems = <List>OrderItem // OrderItem being the other entity I want to map on   order 

我想我要当我选择(手动执行此操作)的命令并设置它的OrderItems属性,因为没有FKs可用。

我在正确的轨道上吗?

**编辑:

我能够创建订单和的OrderItems之间的关联,这里是我有一个顺序的选择()方法:

public Order Select(long orderID) 
    { 
     using (var ctx = new BillingSystemEntities()) 
     { 
      var res = from n in ctx.Orders 
         where n.OrderID == orderID 
         select n; 
       if (res.Count() == 0) 
        return null; 
       else 
        return res.First(); 
     } 
    } 

根据SQL事件探查器,EF是不在OrderItem表上进行任何JOIN。我想我需要将它们加载到我自己的OrderItems导航属性中?

+2

如果你不使用外键,你怎么了'OrderItem'关联到'Order'? – CodingGorilla

+1

即使数据库没有这样配置,您也可以告诉EF列是外键。 – cadrell0

+0

cadrell0是对的。我有两个表共享列(orderID),所以应用程序可以链接两行的行。它只是没有在数据库中配置。 –

回答

2

你只需要在查询中包括了OrderItems

public Order Select(long orderID) 
{ 
    using (var ctx = new BillingSystemEntities()) 
    { 
     var res = from n in ctx.Orders.Include("OrderItems") 
        where n.OrderID == orderID 
        select n; 
     return res.FirstOrDefault(); 
    } 
} 

而且FirstOrDefault是比较合适的,这里比你Count()...First()结构,因为它击中的数据库只有一次,而Count()First()会针对每一个单独的查询。

你可以写它更加紧凑与:

public Order Select(long orderID) 
{ 
    using (var ctx = new BillingSystemEntities()) 
    { 
     return ctx.Orders.Include("OrderItems") 
      .FirstOrDefault(n => n.OrderID == orderID); 
    } 
} 
+0

工程奇迹,谢谢! –