2012-05-14 2 views
1

Я делаю несколько тестов, чтобы получить представление объектно-реляционного сопоставления с использованием LINQ to SQL, и я застрял, пытаясь сделать работу «многие ко многим». Чтобы это было просто, предположим, что у меня есть Заказать класс, которому принадлежит коллекция заказанных Продукты. Как я могу сопоставить эту коллекцию продуктов с помощью LINQ to SQL?Как сопоставить коллекцию объектов с использованием 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 в качестве контейнера провести заказ «s Продуктов, но он не работает, потому что LINQ запросы возвращаются Заказать объектов с израсходованными коллекциями.

PS: Из This question кажется, что мне нужно, чтобы создать третий класс, чтобы следить за заказа продукции отношений, но я надеялся найти способ сделать это без того, чтобы создать еще один класс.

ответ

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); 
     } 
    } 
} 
0

Как @TheEvilPenguin указывает,

  • LINQ к SQL карт классов к таблицам
  • Вам нужен стол OrderProduct для облегчения этого многие-многие отношения в базе данных
  • поэтому LINQ-to-SQL потребуется также отобразить эту таблицу.

Перетащите это соединение в конструктор. Вы будете иметь собственность на Order имени OrderProduct, и вы будете иметь возможность навигации к Products на Order через OrderProducts собственности

foreach (var op in Order.OrderProducts) 
{ 
    var product = op.Product; 
} 
Смежные вопросы