2013-07-21 3 views
0

Я искал onObjectMaterialized, который я использовал в EF 4, чтобы запустить код, как только материализуется сущность. Но только нашел 3 ответа, и никто действительно не помог.структура сущности 5 onObjectMaterialized отсутствует?

В EF4 я помню редактирование шаблонов VS.NET EF, а затем обновление VS.NET для использования этих новых шаблонов, которые заставляют ObjectContext активировать поддержку.

Но с EF 5 у меня теперь есть DBC-контекст, и я не могу понять, как сделать то же самое.

Ваша помощь очень признательна.

+1

Что вы пытаетесь сделать точно? Возможно, есть лучший способ сделать то, что вы хотите? Вы пытаетесь инициализировать объекты? –

+0

У меня есть «упакованное поле», которое мне нужно распаковать. Я не контролирую базу данных или структуры. С EF5 я должен материализовать объект, а затем вызвать метод распаковки. Alt должен добавить чек, чтобы все распаковывалось, если это необходимо, но это много повторяющегося кода. – JustMeToo

+1

Вы всегда можете использовать адаптер контекста объекта. Что-то вроде этого '((IObjectContextAdapter) this) .ObjectContext.ObjectMaterialized + = this.ObjectContext_OnObjectMaterialized;' –

ответ

0

Еще лучшим решением было просто исключить всю вещь edmx и использовать обратный код первого подхода. Это оказалось намного более эффективным, и мне не пришлось играть в игры с xml в edmx.

1

Спасибо Mystere Man, у меня есть ответ. И это намного проще, чем я думал.

У других может быть другой подход, но ключевая информация одинаков.

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

Под xxxModel.edmx в решении должно быть 4 отдельных файла. Откройте ту, которая заканчивается на .tt. Это шаблон.

В шаблоне добавьте вызов метода после кода шаблона, чтобы создать конструктор. Код шаблона должен выглядеть примерно так:

<#=Accessibility.ForType(container)#> partial class <#=code.Escape(container)#> : DbContext 
    { 
     public <#=code.Escape(container)#>() 
      : base("name=<#=container.Name#>") 
     { 
      // Put your method call here 
      MyConstructor(); 

Теперь в вашем частичном классе (или шаблона, если вы не используете разделяемые классы), определяют метод и добавить код из Mystere Man.

protected void MyConstructor() 
    { 
     ((IObjectContextAdapter)this).ObjectContext.ObjectMaterialized += this.ObjectContext_OnObjectMaterialized; 
    } 

Тогда вы просто добавить метод к огню:

public void ObjectContext_OnObjectMaterialized(Object sender, ObjectMaterializedEventArgs e) 
    { 
     if (e.Entity is IMyEntityClass) ..... 

или что вы хотите, чтобы произошло, когда объект materialzed. В моем случае, я просто проверить, если объект является типом, который держит уплотненное поле и, если да, то вызовите код распаковать его (который находится в частичном классе сущности.)

Наслаждайтесь

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