public void Intercept(IInvocation invocation) { Entity entity = invocation.InvocationTarget.CastToType <Entity>(); Debug.Assert(entity.IsNotNull(), "CollectionInterceptor error"); if (!entity.Disposing) { string propertyName = invocation.Method.Name; if (propertyName.StartsWith("get_")) { propertyName = propertyName.Substring(4, propertyName.Length - 4); } EntityProperty property = entity.EntityCtx.Properties.FirstOrDefault(p => p.Name == propertyName); if (property.IsNotNull() && property.ReletedEntity.IsNotNull() && property.ReletedEntity.Related == Releted.List && property.ReletedEntity.Relation.IsNotNull()) { EntitiesRelation relation = property.ReletedEntity.Relation; if (!relation.Child.Entity.Uid.Equals(entity.GetUid(propertyName))) { invocation.Proceed(); List <T> list = relation.Child.Entity.Entities.Where(c => c.State != EntityState.Deleted && relation.Parent.Value(entity). Equals(relation.Child.Value(c)) && property.ReletedEntity.Discriminators.TrueForAll(new Predicate <Discriminator>((d) => { return(d.Discriminate(c)); }))).Cast <T>().ToList(); if (invocation.ReturnValue.IsNull()) { EntitiesCollection <T> collection = new EntitiesCollection <T>(list); collection.Context = entity.Context; collection.Releted = property.ReletedEntity; collection.ParentValue = relation.Parent.Value(entity); invocation.ReturnValue = collection; if (property.Setter.IsNotNull()) { entity[propertyName] = collection; } } else { EntitiesCollection <T> current = invocation.ReturnValue as EntitiesCollection <T>; current.CopyFromMainCollection = true; list.ForEach((e) => current.AddIfNotContains <T>(e)); for (int i = current.Count - 1; i >= 0; i--) { T e = current[i]; if (!list.Contains(e)) { current.Remove(e); } } current.CopyFromMainCollection = false; } entity.SetUid(propertyName, relation.Child.Entity.Uid); } else { invocation.Proceed(); } } else { Debug.Assert(false, "CollectionInterceptor error"); } } else { invocation.Proceed(); } }
public static void Remove(ScreenVisibility element) => _entities.Remove(element);