private EntityStateDetector() { this.ExistsStrategy = new Lazy <EntityStateDetectorExistsStrategy>(() => { foreach (var column in this.Table.PrimaryKeys) { if (column.Flags.HasFlag(ColumnFlags.Generated)) { continue; } return(item => { var query = this.Database.QueryCache.Exists(this.Table); var parameters = new PrimaryKeysParameterHandlerStrategy(this.Table, item); var exists = this.Database.ExecuteScalar <bool>(query, parameters.Handler, this.Transaction); if (exists) { return EntityState.Exists; } return EntityState.None; }); } return(item => { if (EntityKey.HasKey(this.Table, item)) { return EntityState.Exists; } return EntityState.None; }); }); this.FetchStrategy = new Lazy <EntityStateDetectorFetchStrategy>(() => { return((object item, out object persisted) => { if (EntityKey.HasKey(this.Table, item)) { var set = this.Database.Set(item.GetType(), this.Database.Source(this.Composer, this.Transaction)); persisted = set.Find(EntityKey.GetKey(this.Table, item)); if (persisted != null) { return EntityState.Exists; } } persisted = null; return EntityState.None; }); }); }
protected virtual void GetChildren <T, TRelation>(ICollectionRelationConfig <T, TRelation> relation, T item, out IDictionary <object, TRelation> mapped, out IList <TRelation> unmapped) { mapped = new Dictionary <object, TRelation>(); unmapped = new List <TRelation>(); if (item != null) { var children = relation.Accessor.Get(item); foreach (var child in children) { var key = default(object); if (EntityKey.HasKey(relation.RightTable, child, out key)) { mapped.Add(key, child); } else { unmapped.Add(child); } } } }