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; }); }); }
public bool KeyChanged(ITableConfig table) { if (!this.Exists(table)) { return(false); } var key = default(object); if (!this.HasKey(table, out key)) { return(true); } var item = this.Get(table); if (!EqualityComparerFactory.Instance.Create(table.PrimaryKey.Property.PropertyType).Equals(EntityKey.GetKey(table, item), key)) { return(true); } return(false); }