private void AddInternal(TItem item) { if (item == null) { return; } if (ModelRegistry.IsManagedModel(item) && !ModelRegistry.IsManagedBy(Session, item)) { var id = ModelRegistry.GetId(item); throw new UnmanagedModelException(item.GetType(), id); } var itemId = ModelRegistry.GetOrCreateId(item); Session.Cache.Update(itemId, item); if (Ids.Contains(itemId)) { return; } Ids.Add(itemId); IsModified = true; }
private void ThrowIfUnmanaged(object model) { if (ModelRegistry.IsUnmanagedModel(model) || !ModelRegistry.IsManagedBy(this, model)) { throw new UnmanagedModelException(model.GetType(), ModelRegistry.GetId(model)); } }
public Task Delete <TModel>(TModel model) { ThrowIfDisposed(); var id = ModelRegistry.GetId(model); return(Delete <TModel>(id)); }
public bool Contains(TItem item) { if (item == null) { return(false); } Initialize(); return(Ids.Contains(ModelRegistry.GetId(item))); }
public TRltn GetReference <TModel, TRltn>(TModel model, string rltnName) { ThrowIfDisposed(); // Assumption here is that GetReference is only used by HasOne to initialize itself var resource = ModelRegistry.GetResource(model); if (resource == null) { throw new UnmanagedModelException(model.GetType(), ModelRegistry.GetId(model)); } var relationships = resource.Relationships; if (relationships == null || !relationships.TryGetValue(rltnName, out var rltn)) { var related = GetSingleRelated(model, rltnName); rltn = new Relationship { Data = related != null ? JToken.FromObject(ModelRegistry.GetResource(related).ToResourceIdentifier()) : JValue.CreateNull() }; } // if we make it to here, 'rltn' has been set if (rltn == null) { throw new ModelMapException("Cannot find HasOne relationship", model.GetType(), ModelRegistry.GetId(model)); } var rltnData = rltn.Data; ResourceIdentifier rltnIdentifier; if (rltnData == null || rltnData.Type == JTokenType.Null) { return(default(TRltn)); } if (rltnData.Type == JTokenType.Object) { // TODO: I don't like that we're performing this conversion for every get rltnIdentifier = rltnData.ToObject <ResourceIdentifier>(); } else { throw new ModelMapException( $"Relationship {rltnName} mapped as [HasOne] but json relationship data was not an object", typeof(TModel), ModelRegistry.GetId(model)); } // calling Get<TRltn>(...) here will check the cache first, then go remote if necessary return(Get <TRltn>(rltnIdentifier.Id).GetAwaiter().GetResult()); }
public void GetModelId__Given__WovenModel__When_IdSet__Then_GetId (Guid id) { var config = new ModelConfiguration(typeof(ModelWithPublicIdSetter)); var subject = new ModelRegistry(new[] { config }, new JsonSerializerSettings()); var model = new ModelWithPublicIdSetter { Id = id }; var result = subject.GetId(model); Assert.Equal(id, result); }
public Resource BuildModelResource(object model) { var resourceType = ModelRegistry.GetResourceType(model.GetType()); // attributes var modelAttributes = ModelRegistry.GetAttributeValues(model); foreach (var attr in modelAttributes.Properties().ToArray()) { if (attr.Value.Type == JTokenType.Null) { attr.Remove(); } } // relationships // Note: this process sets unset model Ids in order to create relationships var relationships = ModelRegistry.GetRelationshipValues(model); foreach (var rtln in relationships.ToList()) { if (rtln.Value.Data.Type == JTokenType.Null) { relationships.Remove(rtln); } } var modelMeta = ModelRegistry.GetMetaValues(model); foreach (var meta in modelMeta.Properties().ToArray()) { if (meta.Value.Type == JTokenType.Null) { meta.Remove(); } } return(new Resource { Id = ModelRegistry.GetId(model), Type = resourceType, Attributes = modelAttributes.HasValues ? modelAttributes : null, Relationships = relationships.Any() ? relationships : null, Meta = modelMeta.HasValues ? modelMeta : null }); }
public bool Remove(TItem item) { if (item == null) { return(true); } Initialize(); var itemId = ModelRegistry.GetId(item); var removed = Ids.Remove(itemId); if (removed) { IsModified = true; } return(removed); }