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);
            }
        }
Exemplo n.º 2
0
        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);
            }
        }