2013-09-25 2 views
0

Я работаю над проектом C# с запросом на Sql Db автогенерируемыми классами с помощью инструмента sqlmetal. Это прекрасно работает.Сопоставление другой таблицы во многих отношениях

Моя проблема заключается в том, что в моей БД у меня есть к таблицам (TABLEA и TableB), которые имеют many to many отношения, таким образом, есть третья таблица называется TableATableB который содержит только первичные ключи TableA и ТаблицаB.

Так что, как и ожидалось, мой EntityModel имеет класс с именем TableA, который имеет свойство с именем TableATableB, который представляет собой набор всех связанных TableATableB строк.

Это автоматически сгенерированное свойство:

[global::System.Data.Linq.Mapping.AssociationAttribute(Name="FK_TableATableB_TableA", Storage="_TableATableB", ThisKey="Id", OtherKey="TableAId", DeleteRule="CASCADE")] 
    public EntitySet<TableATableB> TableATableB 
    { 
     get 
     { 
      return this._TableATableB; 
     } 
     set 
     { 
      this._TableATableB.Assign(value); 
     } 
    } 

Дело в том, Я хотел TABLEA иметь свойство с именем TableB, который дает мне непосредственно в System.Data.EntitySet<TableB> коллекцию всех связанных TableB строки, есть ли способ сделать это? Я пытался это сделать, но я не нашел способ его сопоставить.

Чтобы уточнить, я знаю, что обходной путь может быть следующим, но я пытаюсь понять, есть ли лучший способ. Кроме того, таким образом, как я мог узнать, когда в коллекцию добавлен объект TableB, чтобы добавить соответствующий объект TableATableB?

partial class TableA 
{ 
    public List<TableB> TableB 
    { 
     get 
     { 
      List<TableB> tableBRows = new List<TableB>(); 

      foreach (TableATableB tAtB in this.TableATableB) 
      { 
       tableBRows.Add(tAtB.TableB); 
      } 
      return tableBRows; 
     } 
     set 
     { 
      // What to do here? 
      // I need to know when an element is added in order to add its respective 
      // TableATableB object 
     } 
    } 

Заранее благодарен.

+2

Это похоже на LINQ-to-SQL *, а не на платформу Entity Framework, не так ли? Вы должны соответственно изменить теги. – Slauma

ответ

1

Linq to SQL не поддерживает поведение, которое вы желаете. L2S не поддерживает неявные много-много коллекций, таких как EF.

Entity Framework делает, но требует, чтобы все поля таблицы большого числа (TableATableB в вашем случае) составляли первичный ключ этой таблицы. Например, если первичным ключом TableA является первичный ключ Id и TableB, то Id, тогда TableATableB должен иметь ровно два поля: TableA_Id и TableB_Id, которые являются первичным ключом этой таблицы. Если TableATableB должен был иметь три поля в этом случае, такие как Id, TableA_Id и TableB_Id, а Id - первичный ключ таблицы многих многих, то EF не может и не будет рассматривать это как неявную коллекцию многих-многих.

+0

Привет, спасибо! Это именно то, что я ищу. У меня просто есть небольшой вопрос: если в таблице «TableATableB» есть третье поле, например, дата, где EF помещает это свойство? – Dante

+0

Я верю, что база данных EF сначала сгенерировала бы класс с именем TableATableB, и эта таблица не может быть неявной коллекцией многих-многих. Вместо этого вы получите таблицы TableA.TableATableBs и TableB.TableATables вместо того, что хотите (например, TableA.TableBs и TableB.TableAs). TableATableB будет иметь свойство, соответствующее полю даты. –

+0

Помимо этого: Вы сначала посмотрели на EF-код? Если вы используете EF, и у вас есть полный контроль над базой данных, я сначала рекомендую сначала использовать код EF с миграциями (http://msdn.microsoft.com/en-us/data/jj591621.aspx) через базу данных EF и EF. –

Смежные вопросы