2012-01-04 2 views
1

Я думаю, что этот вопрос, вероятно, довольно простой, но я искал его и не смог найти то, что искал.Entity Framework - Включая таблицы, не отображаемые в модели данных?

Моя команда и я добавляем новый модуль к существующему веб-приложению. У нас уже есть существующая модель данных, привязанная к нашему sql db, и она довольно огромная ... Поэтому для нового модуля я создал новую модель данных EF непосредственно из нашей базы данных с новыми таблицами для нового модуля. Эти новые таблицы ссылаются на некоторые из наших существующих таблиц через внешние ключи, но когда я добавляю эти таблицы, все внешние ключи должны быть сопоставлены для этой таблицы, их таблиц и их таблиц ... и это кажется огромным беспорядком ,

Мой вопрос заключается в том, что вместо добавления старых таблиц в модель данных, поскольку я только ссылаюсь на идентификаторы наших существующих таблиц для целей внешнего ключа, могу ли я просто сделать .Includes("old table") где-то в классе DataContext, или я должен идти назад и добавить эти таблицы в модель и удалить все их отношения? Или, может быть, какой-то другой метод, о котором я даже не подозреваю?

Извините за недостаток кода, это скорее логическая проблема, чем конкретная проблема синтаксиса.

+1

старайтесь избегать EF для критически важных веб-приложений. – garik

+1

Я бы не сказал, что это приложение слишком озабочено производительностью, оно только внутреннее и обслуживает около 20 одновременных пользователей max. Плюс это действительно не касается моего вопроса. –

+0

, и я бы все равно на него напал. Если вы заинтересованы, вы всегда можете интегрировать хранимые процедуры в EF в тех точках, которые могут быть связаны с производительностью. –

ответ

2

Простой ответ: нет. Вы не можете включать объект, который не является частью вашей модели (= не отображается в вашем EDMX, используемом вашим текущим контекстом).

Более сложный ответ: в некоторых особых случаях вы можете, но это требует больших изменений в процессе разработки и способа работы с EF и EDMX. Готовы ли вы сохранить все файлы EDMX вручную в формате XML? В этом случае EF предлагает способ ссылки на целую концептуальную модель в другом, и использовать односторонние отношения от новой модели к старой модели. Это чит, потому что у вас будет несколько концептуальных моделей (CSDL), но один файл сопоставления (MSL), одно хранилище (SSDL) и один контекст, используя все из них. Например, проверьте this article.

1

Я не знаю, что вы можете использовать Include для ссылки на таблицы вне диаграммы EF. Чтобы начать работу с EF, вам нужно включить часть базы данных, если ваш первый проект работает с дискретной функциональной областью, которая, вероятно, была бы такой. Это может обойти тревожный беспорядок при импорте и полной базе данных. Меня это испугало, когда я пытался это сделать.

В нашей аналогичной ситуации - большой старой системе, в которой использовались хранимые процедуры, мы только добавили таблицы, которые мы непосредственно работали в то время. Позже вы всегда можете добавлять дополнительные таблицы по мере необходимости. Не беспокойтесь о внешних ключах на диаграмме EF, которые ссылаются на таблицы, которые не включены. Entity Framework с радостью справляется с этим.

Это означает, что работает два бизнес-слоя, хотя один для сущности и один для доступа к данным старого стиля. Не проблема для нас. На самом деле, из того, что я читал о устаревшем системном программировании, это, вероятно, путь - у вас есть бизнес-уровень с вашими неряшливыми старыми вещами и бизнес-слоем с вашими блестящими новинками. Продолжайте двигаться от старого к новому, пока один рабочий день не упадет в ничто.

+0

Но это не относится к вопросу, потому что @Dylan хочет использовать 'Include' для объектов, которые не находятся в новой модели. –

+0

достаточно справедливо - я редактировал, чтобы сделать ссылку более четкой. Это работа вокруг –

0

Вы должны использовать [Включить()] над членом.

Например:

 // This class allows you to attach custom attributes to properties 
     // of the Frame class. 
     // 
     // For example, the following marks the Xyz property as a 
     // required property and specifies the format for valid values: 
     // [Required] 
     // [RegularExpression("[A-Z][A-Za-z0-9]*")] 
     // [StringLength(32)] 
     // public string Xyz { get; set; } 
     internal sealed class FrameMetadata 
     { 

      // Metadata classes are not meant to be instantiated. 
      private FrameMetadata() 
      { 
      } 
      [Include()] 
      public EntityCollection<EventFrame> EventFrames { get; set; } 

      public Nullable<int> Height { get; set; } 

      public Guid ID { get; set; } 

      public Layout Layout { get; set; } 

      public Nullable<Guid> LayoutID { get; set; } 

      public Nullable<int> Left { get; set; } 

      public string Name { get; set; } 

      public Nullable<int> Top { get; set; } 

      public Nullable<int> Width { get; set; } 
     } 
    } 

И LINQ должен иметь

.Includes("BaseTable.IncludedTable") 

синтаксис.

И для объектов, которые не являются частью вашей модели, вам необходимо создать несколько классов представления.

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