5 // Copyright (c) 2007-2008 Jiri Moudry, Pascal Craponne
\r
7 // Permission is hereby granted, free of charge, to any person obtaining a copy
\r
8 // of this software and associated documentation files (the "Software"), to deal
\r
9 // in the Software without restriction, including without limitation the rights
\r
10 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
\r
11 // copies of the Software, and to permit persons to whom the Software is
\r
12 // furnished to do so, subject to the following conditions:
\r
14 // The above copyright notice and this permission notice shall be included in
\r
15 // all copies or substantial portions of the Software.
\r
17 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
\r
18 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
\r
19 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
\r
20 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
\r
21 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
\r
22 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
\r
28 using System.Collections;
\r
30 using System.Data.Common;
\r
31 using System.Data.Linq.Mapping;
\r
32 using System.Diagnostics;
\r
33 using System.Collections.Generic;
\r
35 using System.Reflection;
\r
38 using System.Data.Linq.Implementation;
\r
39 using System.Data.Linq.Sugar;
\r
40 using System.Data.Linq.Identity;
\r
42 using AttributeMappingSource = System.Data.Linq.Mapping.AttributeMappingSource;
\r
43 using MappingContext = System.Data.Linq.Mapping.MappingContext;
\r
46 using DbLinq.Data.Linq.Implementation;
\r
47 using DbLinq.Data.Linq.Sugar;
\r
48 using DbLinq.Data.Linq.Identity;
\r
50 using AttributeMappingSource = DbLinq.Data.Linq.Mapping.AttributeMappingSource;
\r
51 using MappingContext = DbLinq.Data.Linq.Mapping.MappingContext;
\r
52 using System.Data.Linq;
\r
55 using DbLinq.Factory;
\r
56 using DbLinq.Logging;
\r
57 using DbLinq.Vendor;
\r
58 using DbLinq.Data.Linq.Database;
\r
59 using DbLinq.Data.Linq.Database.Implementation;
\r
60 using System.Linq.Expressions;
\r
63 namespace System.Data.Linq
\r
65 namespace DbLinq.Data.Linq
\r
68 public partial class DataContext : IDisposable
\r
70 private readonly Dictionary<string, ITable> _tableMap = new Dictionary<string, ITable>();
\r
72 public MetaModel Mapping { get; private set; }
\r
73 // PC question: at ctor, we get a IDbConnection and the Connection property exposes a DbConnection
\r
75 public DbConnection Connection { get { return DatabaseContext.Connection as DbConnection; } }
\r
77 // all properties below are set public to optionally be injected
\r
78 internal IVendor Vendor { get; set; }
\r
79 internal IQueryBuilder QueryBuilder { get; set; }
\r
80 internal IQueryRunner QueryRunner { get; set; }
\r
81 internal IMemberModificationHandler MemberModificationHandler { get; set; }
\r
82 internal IDatabaseContext DatabaseContext { get; private set; }
\r
83 internal ILogger Logger { get; set; }
\r
84 // /all properties...
\r
86 // entities may be registered in 3 sets: InsertList, EntityMap and DeleteList
\r
87 // InsertList is for new entities
\r
88 // DeleteList is for entities to be deleted
\r
89 // EntityMap is the cache: entities are alive in the DataContext, identified by their PK (IdentityKey)
\r
90 // an entity can only live in one of the three caches, so the DataContext will provide 6 methods:
\r
91 // 3 to register in each list, 3 to unregister
\r
92 //internal IEntityMap EntityMap { get; set; }
\r
93 //internal readonly EntityList InsertList = new EntityList();
\r
94 //internal readonly EntityList DeleteList = new EntityList();
\r
95 private readonly EntityTracker entityTracker = new EntityTracker();
\r
97 private IIdentityReaderFactory identityReaderFactory;
\r
98 private readonly IDictionary<Type, IIdentityReader> identityReaders = new Dictionary<Type, IIdentityReader>();
\r
102 /// The default behavior creates one MappingContext.
\r
105 internal virtual MappingContext _MappingContext { get; set; }
\r
108 internal IVendorProvider _VendorProvider { get; set; }
\r
111 public DataContext(IDbConnection connection, MappingSource mapping)
\r
113 Init(new DatabaseContext(connection), mapping, null);
\r
117 public DataContext(IDbConnection connection)
\r
119 Init(new DatabaseContext(connection), null, null);
\r
123 public DataContext(string fileOrServerOrConnection, MappingSource mapping)
\r
125 throw new NotImplementedException();
\r
129 public DataContext(string fileOrServerOrConnection)
\r
131 throw new NotImplementedException();
\r
134 private void Init(IDatabaseContext databaseContext, MappingSource mappingSource, IVendor vendor)
\r
137 if (databaseContext == null)
\r
138 throw new ArgumentNullException("databaseContext");
\r
140 Logger = ObjectFactory.Get<ILogger>();
\r
142 _VendorProvider = ObjectFactory.Get<IVendorProvider>();
\r
143 if (vendor == null)
\r
144 Vendor = _VendorProvider.FindVendorByProviderType(typeof(SqlClient.Sql2005Provider));
\r
148 DatabaseContext = databaseContext;
\r
150 MemberModificationHandler = ObjectFactory.Create<IMemberModificationHandler>(); // not a singleton: object is stateful
\r
151 QueryBuilder = ObjectFactory.Get<IQueryBuilder>();
\r
152 QueryRunner = ObjectFactory.Get<IQueryRunner>();
\r
154 //EntityMap = ObjectFactory.Create<IEntityMap>();
\r
155 identityReaderFactory = ObjectFactory.Get<IIdentityReaderFactory>();
\r
157 _MappingContext = new MappingContext();
\r
159 // initialize the mapping information
\r
160 if (mappingSource == null)
\r
161 mappingSource = new AttributeMappingSource();
\r
162 Mapping = mappingSource.GetModel(GetType());
\r
166 public Table<TEntity> GetTable<TEntity>() where TEntity : class
\r
168 return (Table<TEntity>)GetTable(typeof(TEntity));
\r
171 public ITable GetTable(Type type)
\r
175 string tableName = type.FullName;
\r
176 ITable tableExisting;
\r
177 if (_tableMap.TryGetValue(tableName, out tableExisting))
\r
178 return tableExisting;
\r
180 var tableNew = Activator.CreateInstance(
\r
181 typeof(Table<>).MakeGenericType(type)
\r
182 , BindingFlags.NonPublic | BindingFlags.Instance
\r
184 , new object[] { this }
\r
185 , System.Globalization.CultureInfo.CurrentCulture) as ITable;
\r
187 _tableMap[tableName] = tableNew;
\r
192 public void SubmitChanges()
\r
194 SubmitChanges(ConflictMode.FailOnFirstConflict);
\r
200 /// <returns></returns>
\r
201 public bool DatabaseExists()
\r
205 return Vendor.Ping(this);
\r
214 /// Commits all pending changes to database
\r
216 /// <param name="failureMode"></param>
\r
217 public virtual void SubmitChanges(ConflictMode failureMode)
\r
219 using (DatabaseContext.OpenConnection()) //ConnMgr will close connection for us
\r
220 using (IDatabaseTransaction transaction = DatabaseContext.Transaction())
\r
222 var queryContext = new QueryContext(this);
\r
223 var entityTracks = entityTracker.EnumerateAll().ToList();
\r
224 foreach (var entityTrack in entityTracks)
\r
226 switch (entityTrack.EntityState)
\r
228 case EntityState.ToInsert:
\r
229 var insertQuery = QueryBuilder.GetInsertQuery(entityTrack.Entity, queryContext);
\r
230 QueryRunner.Insert(entityTrack.Entity, insertQuery);
\r
231 Register(entityTrack.Entity);
\r
233 case EntityState.ToWatch:
\r
234 if (MemberModificationHandler.IsModified(entityTrack.Entity, Mapping))
\r
236 var modifiedMembers = MemberModificationHandler.GetModifiedProperties(entityTrack.Entity, Mapping);
\r
237 var updateQuery = QueryBuilder.GetUpdateQuery(entityTrack.Entity, modifiedMembers, queryContext);
\r
238 QueryRunner.Update(entityTrack.Entity, updateQuery, modifiedMembers);
\r
240 RegisterUpdateAgain(entityTrack.Entity);
\r
243 case EntityState.ToDelete:
\r
244 var deleteQuery = QueryBuilder.GetDeleteQuery(entityTrack.Entity, queryContext);
\r
245 QueryRunner.Delete(entityTrack.Entity, deleteQuery);
\r
247 UnregisterDelete(entityTrack.Entity);
\r
250 throw new ArgumentOutOfRangeException();
\r
253 // TODO: handle conflicts (which can only occur when concurrency mode is implemented)
\r
254 transaction.Commit();
\r
259 /// TODO - allow generated methods to call into stored procedures
\r
262 internal IExecuteResult _ExecuteMethodCall(DataContext context, System.Reflection.MethodInfo method, params object[] sqlParams)
\r
264 using (DatabaseContext.OpenConnection())
\r
266 System.Data.Linq.IExecuteResult result = Vendor.ExecuteMethodCall(context, method, sqlParams);
\r
272 protected IExecuteResult ExecuteMethodCall(object instance, System.Reflection.MethodInfo methodInfo, params object[] parameters)
\r
274 throw new NotImplementedException();
\r
277 #region Identity management
\r
280 internal IIdentityReader _GetIdentityReader(Type t)
\r
282 IIdentityReader identityReader;
\r
283 lock (identityReaders)
\r
285 if (!identityReaders.TryGetValue(t, out identityReader))
\r
287 identityReader = identityReaderFactory.GetReader(t, this);
\r
288 identityReaders[t] = identityReader;
\r
291 return identityReader;
\r
295 internal object _GetRegisteredEntity(object entity)
\r
297 // TODO: check what is faster: by identity or by ref
\r
298 var identityReader = _GetIdentityReader(entity.GetType());
\r
299 var identityKey = identityReader.GetIdentityKey(entity);
\r
300 if (identityKey == null) // if we don't have an entitykey here, it means that the entity has no PK
\r
303 var registeredEntityTrack = entityTracker.FindByIdentity(identityKey);
\r
304 if (registeredEntityTrack != null)
\r
305 return registeredEntityTrack.Entity;
\r
309 //internal object GetRegisteredEntityByKey(IdentityKey identityKey)
\r
311 // return EntityMap[identityKey];
\r
315 /// Registers an entity in a watch state
\r
317 /// <param name="entity"></param>
\r
318 /// <returns></returns>
\r
320 internal object _GetOrRegisterEntity(object entity)
\r
322 var identityReader = _GetIdentityReader(entity.GetType());
\r
323 var identityKey = identityReader.GetIdentityKey(entity);
\r
324 SetEntitySetsQueries(entity);
\r
325 SetEntityRefQueries(entity);
\r
327 // if we have no identity, we can't track it
\r
328 if (identityKey == null)
\r
331 // try to find an already registered entity and return it
\r
332 var registeredEntityTrack = entityTracker.FindByIdentity(identityKey);
\r
333 if (registeredEntityTrack != null)
\r
334 return registeredEntityTrack.Entity;
\r
336 // otherwise, register and return
\r
337 entityTracker.RegisterToWatch(entity, identityKey);
\r
341 readonly IDataMapper DataMapper = ObjectFactory.Get<IDataMapper>();
\r
342 private void SetEntityRefQueries(object entity)
\r
344 Type thisType = entity.GetType();
\r
345 IList<MemberInfo> properties = DataMapper.GetEntityRefAssociations(thisType);
\r
348 foreach (PropertyInfo prop in properties)
\r
350 //example of entityRef:Order.Employee
\r
351 AssociationAttribute associationInfo = prop.GetAttribute<AssociationAttribute>();
\r
352 Type otherTableType = prop.PropertyType;
\r
353 IList<MemberInfo> otherPKs = DataMapper.GetPrimaryKeys(Mapping.GetTable(otherTableType));
\r
355 if (otherPKs.Count > 1)
\r
356 throw new NotSupportedException("Multiple keys object not supported yet.");
\r
358 var otherTable = GetTable(otherTableType);
\r
360 //ie:EmployeeTerritories.EmployeeID
\r
362 var thisForeignKeyProperty = thisType.GetProperty(associationInfo.ThisKey);
\r
363 object thisForeignKeyValue = thisForeignKeyProperty.GetValue(entity, null);
\r
365 IEnumerable query = null;
\r
366 if (thisForeignKeyValue != null)
\r
368 ParameterExpression p = Expression.Parameter(otherTableType, "other");
\r
369 Expression predicate;
\r
370 if (!(thisForeignKeyProperty.PropertyType.IsNullable()))
\r
372 predicate = Expression.Equal(Expression.MakeMemberAccess(p, otherPKs.First()),
\r
373 Expression.Constant(thisForeignKeyValue));
\r
377 var ValueProperty = thisForeignKeyProperty.PropertyType.GetProperty("Value");
\r
378 predicate = Expression.Equal(Expression.MakeMemberAccess(p, otherPKs.First()),
\r
379 Expression.Constant(ValueProperty.GetValue(thisForeignKeyValue, null)));
\r
382 query = GetOtherTableQuery(predicate, p, otherTableType, otherTable) as IEnumerable;
\r
383 //it would be interesting surround the above query with a .Take(1) expression for performance.
\r
387 FieldInfo entityRefField = entity.GetType().GetField(associationInfo.Storage, BindingFlags.NonPublic | BindingFlags.Instance);
\r
388 object entityRefValue = null;
\r
390 entityRefValue = Activator.CreateInstance(entityRefField.FieldType, query);
\r
392 entityRefValue = Activator.CreateInstance(entityRefField.FieldType);
\r
393 entityRefField.SetValue(entity, entityRefValue);
\r
398 /// This method is executed when the entity is being registered. Each EntitySet property has a internal query that can be set using the EntitySet.SetSource method.
\r
399 /// Here we set the query source of each EntitySetProperty
\r
401 /// <param name="entity"></param>
\r
402 private void SetEntitySetsQueries(object entity)
\r
404 IList<MemberInfo> properties = DataMapper.GetEntitySetAssociations(entity.GetType());
\r
405 IList<MemberInfo> thisPKs = DataMapper.GetPrimaryKeys(Mapping.GetTable(entity.GetType()));
\r
407 if (thisPKs.Count > 1 && properties.Any())
\r
408 throw new NotSupportedException("Multiple keys object not supported yet.");
\r
410 object primaryKeyValue = (thisPKs.First() as PropertyInfo).GetValue(entity, null);
\r
413 foreach (PropertyInfo prop in properties)
\r
415 //example of entitySet: Employee.EmployeeTerritories
\r
416 var associationInfo = prop.GetAttribute<AssociationAttribute>();
\r
417 Type otherTableType = prop.PropertyType.GetGenericArguments().First();
\r
419 //other table:EmployeeTerritories
\r
420 var otherTable = GetTable(otherTableType);
\r
421 //other table member:EmployeeTerritories.EmployeeID
\r
422 var otherTableMember = otherTableType.GetProperty(associationInfo.OtherKey);
\r
425 ParameterExpression p = Expression.Parameter(otherTableType, "other");
\r
426 Expression predicate;
\r
427 if (!(otherTableMember.PropertyType.IsNullable()))
\r
429 predicate = Expression.Equal(Expression.MakeMemberAccess(p, otherTableMember),
\r
430 Expression.Constant(primaryKeyValue));
\r
434 var ValueProperty = otherTableMember.PropertyType.GetProperty("Value");
\r
435 predicate = Expression.Equal(Expression.MakeMemberAccess(
\r
436 Expression.MakeMemberAccess(p, otherTableMember),
\r
438 Expression.Constant(primaryKeyValue));
\r
441 var query = GetOtherTableQuery(predicate, p, otherTableType, otherTable);
\r
443 var entitySetValue = prop.GetValue(entity, null);
\r
445 if (entitySetValue == null)
\r
447 entitySetValue = Activator.CreateInstance(prop.PropertyType);
\r
448 prop.SetValue(entity, entitySetValue, null);
\r
451 var setSourceMethod = entitySetValue.GetType().GetMethod("SetSource");
\r
452 setSourceMethod.Invoke(entitySetValue, new[] { query });
\r
453 //employee.EmployeeTerritories.SetSource(Table[EmployeesTerritories].Where(other=>other.employeeID="WARTH"))
\r
457 private object GetOtherTableQuery(Expression predicate, ParameterExpression parameter, Type otherTableType, IQueryable otherTable)
\r
459 //predicate: other.EmployeeID== "WARTH"
\r
460 Expression lambdaPredicate = Expression.Lambda(predicate, parameter);
\r
461 //lambdaPredicate: other=>other.EmployeeID== "WARTH"
\r
463 var whereMethod = typeof(Queryable)
\r
464 .GetMethods().First(m => m.Name == "Where")
\r
465 .MakeGenericMethod(otherTableType);
\r
468 Expression call = Expression.Call(whereMethod, otherTable.Expression, lambdaPredicate);
\r
469 //Table[EmployeesTerritories].Where(other=>other.employeeID="WARTH")
\r
471 return otherTable.Provider.CreateQuery(call);
\r
476 #region Insert/Update/Delete management
\r
479 /// Registers an entity for insert
\r
481 /// <param name="entity"></param>
\r
482 internal void RegisterInsert(object entity)
\r
484 entityTracker.RegisterToInsert(entity);
\r
488 /// Registers an entity for update
\r
489 /// The entity will be updated only if some of its members have changed after the registration
\r
491 /// <param name="entity"></param>
\r
492 internal void RegisterUpdate(object entity)
\r
494 var identityReader = _GetIdentityReader(entity.GetType());
\r
495 var identityKey = identityReader.GetIdentityKey(entity);
\r
496 // if we have no key, we can not watch
\r
497 if (identityKey == null)
\r
500 entityTracker.RegisterToWatch(entity, identityKey);
\r
504 /// Registers or re-registers an entity and clears its state
\r
506 /// <param name="entity"></param>
\r
507 /// <returns></returns>
\r
508 internal object Register(object entity)
\r
510 var registeredEntity = _GetOrRegisterEntity(entity);
\r
511 // the fact of registering again clears the modified state, so we're... clear with that
\r
512 MemberModificationHandler.Register(registeredEntity, Mapping);
\r
513 return registeredEntity;
\r
517 /// Registers an entity for update
\r
518 /// The entity will be updated only if some of its members have changed after the registration
\r
520 /// <param name="entity"></param>
\r
521 /// <param name="entityOriginalState"></param>
\r
522 internal void RegisterUpdate(object entity, object entityOriginalState)
\r
524 RegisterUpdate(entity);
\r
525 MemberModificationHandler.Register(entity, entityOriginalState, Mapping);
\r
529 /// Clears the current state, and marks the object as clean
\r
531 /// <param name="entity"></param>
\r
532 internal void RegisterUpdateAgain(object entity)
\r
534 MemberModificationHandler.ClearModified(entity, Mapping);
\r
538 /// Registers an entity for delete
\r
540 /// <param name="entity"></param>
\r
541 internal void RegisterDelete(object entity)
\r
543 entityTracker.RegisterToDelete(entity);
\r
547 /// Unregisters entity after deletion
\r
549 /// <param name="entity"></param>
\r
550 internal void UnregisterDelete(object entity)
\r
552 entityTracker.RegisterDeleted(entity);
\r
558 /// Changed object determine
\r
560 /// <returns>Lists of inserted, updated, deleted objects</returns>
\r
561 public ChangeSet GetChangeSet()
\r
563 var inserts = new List<object>();
\r
564 var updates = new List<object>();
\r
565 var deletes = new List<object>();
\r
566 foreach (var entityTrack in entityTracker.EnumerateAll())
\r
568 switch (entityTrack.EntityState)
\r
570 case EntityState.ToInsert:
\r
571 inserts.Add(entityTrack.Entity);
\r
573 case EntityState.ToWatch:
\r
574 if (MemberModificationHandler.IsModified(entityTrack.Entity, Mapping))
\r
575 updates.Add(entityTrack.Entity);
\r
577 case EntityState.ToDelete:
\r
578 deletes.Add(entityTrack.Entity);
\r
581 throw new ArgumentOutOfRangeException();
\r
584 return new ChangeSet(inserts, updates, deletes);
\r
588 /// use ExecuteCommand to call raw SQL
\r
590 public int ExecuteCommand(string command, params object[] parameters)
\r
592 var directQuery = QueryBuilder.GetDirectQuery(command, new QueryContext(this));
\r
593 return QueryRunner.Execute(directQuery, parameters);
\r
597 /// Execute raw SQL query and return object
\r
599 public IEnumerable<TResult> ExecuteQuery<TResult>(string query, params object[] parameters) where TResult : class, new()
\r
601 GetTable<TResult>();
\r
602 foreach (TResult result in ExecuteQuery(typeof(TResult), query, parameters))
\r
603 yield return result;
\r
606 public IEnumerable ExecuteQuery(Type elementType, string query, params object[] parameters)
\r
608 var queryContext = new QueryContext(this);
\r
609 var directQuery = QueryBuilder.GetDirectQuery(query, queryContext);
\r
610 return QueryRunner.ExecuteSelect(elementType, directQuery, parameters);
\r
614 /// TODO: DataLoadOptions ds = new DataLoadOptions(); ds.LoadWith<Customer>(p => p.Orders);
\r
617 public DataLoadOptions LoadOptions
\r
623 public DbTransaction Transaction { get; set; }
\r
625 public IEnumerable<TResult> Translate<TResult>(DbDataReader reader)
\r
627 foreach (TResult result in Translate(typeof(TResult), reader))
\r
628 yield return result;
\r
631 public IMultipleResults Translate(DbDataReader reader)
\r
633 throw new NotImplementedException();
\r
636 public IEnumerable Translate(Type elementType, DbDataReader reader)
\r
638 return QueryRunner.EnumerateResult(elementType, reader, this);
\r
641 public void Dispose()
\r
643 //connection closing should not be done here.
\r
644 //read: http://msdn2.microsoft.com/en-us/library/bb292288.aspx
\r
648 protected virtual void Dispose(bool disposing)
\r
650 throw new NotImplementedException();
\r
654 /// Creates a IDbDataAdapter. Used internally by Vendors
\r
656 /// <returns></returns>
\r
657 internal IDbDataAdapter CreateDataAdapter()
\r
659 return DatabaseContext.CreateDataAdapter();
\r
663 /// Sets a TextWriter where generated SQL commands are written
\r
665 public System.IO.TextWriter Log { get; set; }
\r
668 /// Writes the generated SQL on Log (if not null)
\r
669 /// Internal helper
\r
671 /// <param name="sql"></param>
\r
672 internal void WriteLog(string sql)
\r
677 //SELECT [t0].[FirstName] AS [Name], [t1].[FirstName] AS [ReportsTo]
\r
678 //FROM [dbo].[Employees] AS [t0]
\r
679 //LEFT OUTER JOIN [dbo].[Employees] AS [t1] ON [t1].[EmployeeID] = [t0].[ReportsTo]
\r
680 //-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 3.5.30729.1
\r
681 Log.WriteLine(sql);
\r
683 Log.Write(" Context: {0}", Vendor.VendorName);
\r
684 Log.Write(" Model: {0}", Mapping.GetType().Name);
\r
685 Log.Write(" Build: {0}", Assembly.GetExecutingAssembly().GetName().Version);
\r
691 public bool ObjectTrackingEnabled
\r
693 get { throw new NotImplementedException(); }
\r
694 set { throw new NotImplementedException(); }
\r
698 public int CommandTimeout
\r
700 get { throw new NotImplementedException(); }
\r
701 set { throw new NotImplementedException(); }
\r
705 public bool DeferredLoadingEnabled
\r
707 get { throw new NotImplementedException(); }
\r
708 set { throw new NotImplementedException(); }
\r
712 public ChangeConflictCollection ChangeConflicts
\r
714 get { throw new NotImplementedException(); }
\r
718 public DbCommand GetCommand(IQueryable query)
\r
720 throw new NotImplementedException();
\r
724 public void Refresh(System.Data.Linq.RefreshMode mode, System.Collections.IEnumerable entities)
\r
726 throw new NotImplementedException();
\r
730 public void Refresh(RefreshMode mode, params object[] entities)
\r
732 throw new NotImplementedException();
\r
736 public void Refresh(RefreshMode mode, object entity)
\r
738 throw new NotImplementedException();
\r
742 public void DeleteDatabase()
\r
744 throw new NotImplementedException();
\r
748 public void CreateDatabase()
\r
750 throw new NotImplementedException();
\r
754 protected internal IQueryable<TResult> CreateMethodCallQuery<TResult>(object instance, MethodInfo methodInfo, params object[] parameters)
\r
756 throw new NotImplementedException();
\r
760 protected internal void ExecuteDynamicDelete(object entity)
\r
762 throw new NotImplementedException();
\r
766 protected internal void ExecuteDynamicInsert(object entity)
\r
768 throw new NotImplementedException();
\r
772 protected internal void ExecuteDynamicUpdate(object entity)
\r
774 throw new NotImplementedException();
\r