public TInter Add(TRelated relation) { lock (Model.SyncRoot) { if (!model.IsShared) { throw new InvalidOperationException("Cannot add many-to-many relations to non-shared model."); } // The fact that we have to enforce persistance is sad, but currently no better way to keep things simple // and fast execution. if (!relation.IsShared) { throw new ArgumentException("Cannot add non-shared related model.", "relation"); } // Check for duplicates EnsureLoaded(); var inter = relations.FirstOrDefault((m) => (reverse ? m.FromId : m.ToId) == relation.Id); // Create new relation if (inter == null) { inter = Model.Update(new TInter() { From = (TFrom)(reverse ? relation : model), To = (TTo)(reverse ? model : relation), IsPersisted = model.IsPersisted && relation.IsPersisted, }); } return(inter); } }
protected void SetForeignModel <T> (int relationId, T value) where T : Model { lock (SyncRoot) { var fk = fkRelations [relationId - 1]; if (value != null) { value = Model.Update(value); } if (fk.Instance == value) { return; } ChangePropertyAndNotify(fk.InstanceProperty, delegate { fk.Instance = value; }); // Update current id: var id = fk.Instance != null ? fk.Instance.Id : (Guid?)null; if (fk.Id != id) { ChangePropertyAndNotify(fk.IdProperty, delegate { fk.Id = id; }); } } }
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { if (reader.TokenType == JsonToken.Null) { return(null); } var remoteId = Convert.ToInt64(reader.Value); lock (Model.SyncRoot) { var model = Model.Manager.GetByRemoteId(objectType, remoteId); if (model == null) { model = (Model)Activator.CreateInstance(objectType); model.RemoteId = remoteId; model.ModifiedAt = new DateTime(); model = Model.Update(model); } return(model); } }