6

Я новичок в платформе Entity Framework.Разница между EF6 и EF4.1 в иерархии файлов

Я заметил, что когда я использую EF6 with Visual studio 2013:

У меня есть .Designer.cs пустой файл с таким комментарием:

// T4 code generation is enabled for model 'C:\Users\Luka\Desktop\Test\EF-db2008\AdventureWorks\AdventureWorksLib\AdventureWorksLib\AWLTModel.edmx'. 
    // To enable legacy code generation, change the value of the 'Code Generation Strategy' designer 
    // property to 'Legacy ObjectContext'. This property is available in the Properties Window when the model 
    // is open in the designer. 

    // If no context and entity classes have been generated, it may be because you created an empty model but 
    // have not yet chosen which version of Entity Framework to use. To generate a context class and entity 
    // classes for your model, open the model in the designer, right-click on the designer surface, and 
    // select 'Update Model from Database...', 'Generate Database from Model...', or 'Add Code Generation 
    // Item...'. 

.Context.tt и его .Context.cs с кодом, как это:

public partial class AWLTEntities : DbContext 
    { 
     public AWLTEntities() 
      : base("name=AWLTEntities") 
     { 
     } 

     protected override void OnModelCreating(DbModelBuilder modelBuilder) 
     { 
      throw new UnintentionalCodeFirstException(); 
     } 

     public virtual DbSet<Address> Addresses { get; set; } 
     public virtual DbSet<Customer> Customers { get; set; } 
    } 

И затем .tt файл с файлом .cs для каждого объекта, как Customer.cs

С помощью следующего кода:

public partial class Customer 
    { 
     public Customer() 
     { 
      this.NameStyle = false; 
      this.CustomerAddresses = new HashSet<CustomerAddress>(); 
      this.Orders = new HashSet<Order>(); 
     } 

     public int CustomerID { get; set; } 
    } 

Это «s совершенно другое, когда я использую EF4.1 with visual studio 2010, есть только один код позади файла .Designer.cs для модели !!


  • Может кто-нибудь помочь мне понять, что все эти файлы для .Context.tt, .Context.cs, .tt, .cs? И что «s отличается в файлах иерархии между этими двумя случаями (EF6,EF4.1)?
  • Не удалось найти OnPropertyChanging(Value) & OnPropertyChanged() в EF6, чтобы проверить мои сущности !! Почему эти методы больше не существуют и как проверить мои свойства , если они не существуют?

ответ

7

Так позволяет сделать это четкий шаг за шагом:

  • У вас есть свой .edmx файл, который был создан из конструктора или генерируемый из существующей базы данных. Но это всего лишь файл xml, который содержит информацию о структуре базы данных, которая используется - storage scheme, информация об объектах - conceptual schema и сопоставления между этими двумя. Он не содержит исполняемого кода. Этот код необходимо создать.

  • Для генерации кода будет проанализирован файл .edmx и будут созданы файлы .cs, содержащие фактический исполняемый код. могут быть использованы 2 подхода:

    1. генератор встроенный в Visual Studio - инструмент EntityModelCodeGenerator. Это унаследованный подход, который использовался ранее (в Visaul Studio 2010 в вашем случае). Это создаст только файл .Designer.cs со всеми классами внутри него. Но этот подход не самый лучший - вы не можете изменять процесс генерации для своих нужд (скажем, добавить атрибут DataMember к сгенерированным классам или некоторые другие изменения). Вот почему лучше использовать

    2. T4 templates. Это файлы с расширением .tt. Все, что они делают, просто выполняет свою логику, когда в контекстном меню выбрано Run custom tool, или файл .edmx изменен. Существует набор доступных шаблонов для генерации кода EF от .edmx, некоторая информация here. И поскольку это обычные файлы, вы можете их модифицировать по мере необходимости (чтобы лучше использовать редактор, используйте tangible T4 extension). Некоторые основные сведения об использовании шаблонов T4 в EF here.

Вы можете выбрать между этими 2 подходами независимо от визуальной версии Studio - просто измените Code generation strategy свойства в свойствах вашего .edmx файла:

enter image description here

Если опция Legacy ObjectContext является выбрано - вы получаете 1-й способ с одним файлом .Designer.cs. Если T4 - тогда .Designer.cs будет пустым (с комментариями, говорящими, что используются шаблоны T4) и .tt файлы будут генерировать использованный код. Поэтому, если вам нужен тот же код, что и в VS 2010, просто используйте опцию Legacy ObjectContext.

Другим отличием между этими двумя является то, что 1-й генерирует наследие ObjectContext и объекты, которые получены из EntityObect. Все они будут в этом файле .Designer.cs. Но это больше не рекомендуется (однако вы все равно можете получить corresponding T4 template - таким образом вы получите свои OnPropertyChanged и OnPropertyChanging, так как они являются методами класса EntityObect, однако они защищены, поэтому вам может потребоваться написать некоторые обертки). Но лучше использовать POCO classes and DbContext template - тот, который VS 2013 использовал в вашем случае. Затем вы получите отдельный .Context.tt для генерации .Context.cs с производным DbContext в нем с DbSets, представляющим таблицы, и .tt файл для создания классов сущностей.И иерархия между .tt и показывает только, какие .cs были сгенерированы с помощью .tt, тогда как только .cs будет фактически соблюден и выполнен, когда ваше приложение запустится.

  • И теперь относительно OnPropertyChanged - это должна быть только реализация интерфейса INotifyPropertyChanged. Однако похоже, что вы используете шаблон, который генерирует классы POCO. Это стандартная и рекомендуемая опция, но для получения версии INotifyPropertyChanged вам может потребоваться отредактировать шаблон или выбрать другую из галереи Visual Studio Online. Это, однако, не может быть лучшим архитектурным решением, потому что иногда лучше выделять сущности и классы, которые вы используете для логики интерфейса/бизнеса.
+3

Также следует отметить, что EDMX является уходит в EF7. Таким образом, ни одно из этого не будет применимо после EF 6. – danludwig

+1

Да, но это очень больно в EF7, стоит отдельный поток, а не комментарий). Но вкратце - в нашем текущем проекте мы не можем перейти на EF 7 именно из-за этого - мы используем существующую базу данных и подход «Обновить модель из db», который [не поддерживается] (http://blogs.msdn.com/b/adonet/archive/2014/10/21/ef7-what-does-code -первая только-очень-mean.aspx). Например, у нас есть пользовательские имена сопоставления, и они будут сброшены, если мы будем использовать обратный инженер для Code First, и мы не можем позволить себе переименование во всем нашем коде - слишком массивный рефакторинг. И сопоставления функций не поддерживаются в Code First. –

+1

И я полагаю, что «после EF 6» не будет, потому что EF 7 просто [отличается слишком много] (http://blogs.msdn.com/b/adonet/archive/2014/10/27/ef7-v1- или-v7.aspx), поэтому у нас может быть даже 2 рамки для разных потребностей - EF 6 и EF 7. –

3

*.ttT4 templates файлы используются автоматического создания C# код из .EDMX file. Это в основном ваша схема хранения, концептуальная схема и сопоставление между ними. .context.cs является вашим DbContext (бывший ObjectContext), а другие являются сущностями. Инструмент, используемый для генерации кода, - EntityModelCodeGenerator, как видно из свойств файла .edmx. Так что это довольно прямолинейно.

Для того, чтобы получить OnPropertyChanged, что было за EntityObject класс, вы можете попробовать Self-Tracking Entities согласно this manual. Но, как вы видите, теперь это не рекомендуется ... Возможно, все это потребует реализовать интерфейсы INotifyPropertyChanged в ваших сущностях (они partial). EntityObject был заменен прокси-классами. EF генерирует их для каждого объекта (может быть отключен). И включает отслеживание там. Надеюсь, поможет!

ОБНОВЛЕНИЕ. Таким образом, вы можете использовать его для генерации проверки в самих сущностях, но это будет некоторая логика или обработка событий. Обычно это помещается в отдельные модули, в сервисы для «освобождения» ума. Конечно, это зависит от вашего конкретного случая, требований.

+0

STE definitelly не следует использовать только для получения OnPropertyChanged - несколько пользовательских строк в шаблоне T4 сделают это. И с STE у вас есть ChangeTracker и все эти ужасные вещи, которые могут быть полезны для приложений N-уровня (когда у вас нет доступа к контексту и каким-то образом отслеживать изменения), но он реализован так .... грязный, что теперь он устарел. [Other techics] (https://ntieref.codeplex.com/) была разработана для реализации поддержки N-уровня EF, но еще раз это намного сложнее, чем просто реализовать INotifyPropertyChanged –

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