@@ -35,7 +35,7 @@ public EntityFrameworkMaterializer(DbContext context) : base()
3535 /// <param name="type"></param>
3636 /// <param name="idValues"></param>
3737 /// <returns></returns>
38- public virtual object GetById ( Type type , params Object [ ] idValues )
38+ public virtual Task < object > GetByIdAsync ( Type type , params Object [ ] idValues )
3939 {
4040 //TODO: How to react if the type isn't in the context?
4141
@@ -58,20 +58,20 @@ public virtual object GetById(Type type, params Object[] idValues)
5858 i ++ ;
5959 }
6060 }
61- return this . context . Set ( type ) . Find ( idv2 ) ;
61+ return this . context . Set ( type ) . FindAsync ( idv2 ) ;
6262 }
6363
64- public T GetById < T > ( params Object [ ] idValues )
64+ public async Task < T > GetByIdAsync < T > ( params Object [ ] idValues )
6565 {
66- return ( T ) GetById ( typeof ( T ) , idValues ) ;
66+ return ( T ) await GetByIdAsync ( typeof ( T ) , idValues ) ;
6767 }
6868
69- public T Materialize < T > ( T ephemeral )
69+ public async Task < T > MaterializeAsync < T > ( T ephemeral )
7070 {
71- return ( T ) Materialize ( typeof ( T ) , ephemeral ) ;
71+ return ( T ) await MaterializeAsync ( typeof ( T ) , ephemeral ) ;
7272 }
7373
74- public virtual object Materialize ( Type type , object ephemeral )
74+ public virtual async Task < object > MaterializeAsync ( Type type , object ephemeral )
7575 {
7676 IEnumerable < string > keyNames = GetKeyNames ( type ) ;
7777 List < Object > idValues = new List < Object > ( ) ;
@@ -90,7 +90,7 @@ public virtual object Materialize(Type type, object ephemeral)
9090 object retval = null ;
9191 if ( ! anyNull )
9292 {
93- retval = context . Set ( type ) . Find ( idValues . ToArray ( ) ) ;
93+ retval = await context . Set ( type ) . FindAsync ( idValues . ToArray ( ) ) ;
9494 }
9595 if ( retval == null )
9696 {
@@ -101,22 +101,56 @@ public virtual object Materialize(Type type, object ephemeral)
101101 {
102102 // For a new object, if a key is specified, we want to merge the key, at least.
103103 // For simplicity then, make the behavior equivalent to MergeMaterialize in this case.
104- this . Merge ( type , ephemeral , retval ) ;
104+ await this . Merge ( type , ephemeral , retval ) ;
105105 }
106106 }
107107 return retval ;
108108 }
109109
110+ public async Task < T > MaterializeUpdateAsync < T > ( T ephemeral )
111+ {
112+ return ( T ) await MaterializeUpdateAsync ( typeof ( T ) , ephemeral ) ;
113+ }
114+
115+ public async Task < object > MaterializeUpdateAsync ( Type type , object ephemeral )
116+ {
117+ object material = await MaterializeAsync ( type , ephemeral ) ;
118+ await this . Merge ( type , ephemeral , material ) ;
119+ return material ;
120+ }
121+
122+ #endregion
123+
124+ #region Obsolete IMaterializer contract methods
125+
126+ public T GetById < T > ( params object [ ] keyValues )
127+ {
128+ return GetByIdAsync < T > ( keyValues ) . Result ;
129+ }
130+
131+ public object GetById ( Type type , params object [ ] keyValues )
132+ {
133+ return GetByIdAsync ( type , keyValues ) . Result ;
134+ }
135+
136+ public T Materialize < T > ( T ephemeral )
137+ {
138+ return MaterializeAsync < T > ( ephemeral ) . Result ;
139+ }
140+
141+ public object Materialize ( Type type , object ephemeral )
142+ {
143+ return MaterializeAsync ( type , ephemeral ) . Result ;
144+ }
145+
110146 public T MaterializeUpdate < T > ( T ephemeral )
111147 {
112- return ( T ) MaterializeUpdate ( typeof ( T ) , ephemeral ) ;
148+ return MaterializeUpdateAsync < T > ( ephemeral ) . Result ;
113149 }
114150
115151 public object MaterializeUpdate ( Type type , object ephemeral )
116152 {
117- object material = Materialize ( type , ephemeral ) ;
118- this . Merge ( type , ephemeral , material ) ;
119- return material ;
153+ return MaterializeUpdateAsync ( type , ephemeral ) . Result ;
120154 }
121155
122156 #endregion
@@ -246,7 +280,7 @@ protected EntityKey MaterializeEntityKey(Type type, object obj)
246280 return key ;
247281 }
248282
249- private void Merge ( Type type , object ephemeral , object material )
283+ private async Task Merge ( Type type , object ephemeral , object material )
250284 {
251285 PropertyInfo [ ] props = type . GetProperties ( ) ;
252286 foreach ( PropertyInfo prop in props )
@@ -286,15 +320,15 @@ private void Merge (Type type, object ephemeral, object material)
286320 foreach ( EntityKey key in ephemeralKeys . Except ( materialKeys ) )
287321 {
288322 object [ ] idParams = key . EntityKeyValues . Select ( ekv => ekv . Value ) . ToArray ( ) ;
289- object obj = GetById ( elementType , idParams ) ;
323+ object obj = await GetByIdAsync ( elementType , idParams ) ;
290324 mmadd . Invoke ( materialMany , new object [ ] { obj } ) ;
291325 }
292326 // Remove from hasMany
293327 if ( mmremove != null )
294328 foreach ( EntityKey key in materialKeys . Except ( ephemeralKeys ) )
295329 {
296330 object [ ] idParams = key . EntityKeyValues . Select ( ekv => ekv . Value ) . ToArray ( ) ;
297- object obj = GetById ( elementType , idParams ) ;
331+ object obj = await GetByIdAsync ( elementType , idParams ) ;
298332 mmremove . Invoke ( materialMany , new object [ ] { obj } ) ;
299333 }
300334 }
@@ -312,7 +346,7 @@ private void Merge (Type type, object ephemeral, object material)
312346 if ( materialKey != ephemeralKey )
313347 {
314348 object [ ] idParams = ephemeralKey . EntityKeyValues . Select ( ekv => ekv . Value ) . ToArray ( ) ;
315- prop . SetValue ( material , GetById ( prop . PropertyType , idParams ) , null ) ;
349+ prop . SetValue ( material , await GetByIdAsync ( prop . PropertyType , idParams ) , null ) ;
316350 }
317351 // else,
318352 }
@@ -328,6 +362,5 @@ private void Merge (Type type, object ephemeral, object material)
328362 }
329363
330364 }
331-
332365 }
333366}
0 commit comments