Example #1
0
        /// <summary>
        /// Initializes a new instance for partitioned entity or sql entity with pk
        /// </summary>
        public Entity(ulong modelId, params EntityMember[] pks)
        {
            ModelId = modelId;
            if (Model.SysStoreOptions != null)
            {
                if (!Model.SysStoreOptions.HasPartitionKeys
                    /*|| Model.PartitionKeys.Length != pks.Length 不能判断长度相等,因CreateTime*/)
                {
                    throw new ArgumentException("Only ctor for partitioned entity");
                }

                Id = new EntityId();
                InitMembers(Model);

                for (int i = 0; i < Model.SysStoreOptions.PartitionKeys.Length; i++)
                {
                    //TODO:验证Value类型是否一致
                    if (Model.SysStoreOptions.PartitionKeys[i].MemberId != 0)
                    {
                        ref EntityMember m = ref GetMember(Model.SysStoreOptions.PartitionKeys[i].MemberId);
                        m.GuidValue     = pks[i].GuidValue;
                        m.ObjectValue   = pks[i].ObjectValue;
                        m.Flag.HasValue = true;
                    }
                }
            }
Example #2
0
        protected override void InsertItem(int index, Entity item)
        {
            //插入分以下几种情况:
            //1、Add添加新对象
            //2、从查询结果内加载旧对象,包括树状结构查询(排序?)
            //3、移动对象由Move(int,int)方法内处理,这里不用考虑
            //4、树状结构子对象从其他地方移至这里

            //如果属于Entity,则应设置item的相应属性
            if (Parent != null)
            {
                //处理行号,1、树状全部直接加载,根据查询结果是否排序另行处理(先填充再排序,或直接查询排序);
                //        2、延迟加载无需处理行号,已排序;
                //        3、新建的成员行号处理;
                //        4、树状结构移入的成员处理

                /*if (item.PersistentState == PersistentState.Detached)
                 * {
                 *  this.AutoSetRowNumber(index, item, SetMemberModel.RefRowNumberMemberName);
                 * }
                 * else*/
                if (item.PersistentState == PersistentState.Deleted) //表示树状结构间的移动
                {
                    //先从原有的Owner的EntityList的已删除列表内移除,表示树状结构移动后重新插入
                    //注意:必须判断item原来是否是根级,如判断item.Parent是否有值
                    ref EntityMember entityRefMember = ref item.GetMember(EntitySetMember.RefMemberId);
                    if (entityRefMember.HasValue) //非根级
                    {
                        Entity entityRef = (Entity)entityRefMember.ObjectValue;
                        entityRef.GetEntitySet(EntitySetMember.MemberId).DeletedItems.Remove(item);
                    }
                    else //item原来即是根级,即从根级移至某一子级下
                    {
                        (item.Parent as EntityList)?.DeletedItems.Remove(item);
                    }
                    item.PersistentState = PersistentState.Modified;
                    //this.AutoSetRowNumber(index, item, SetMemberModel.RefRowNumberMemberName);
                }//结束新建或删除状态判断
                item.Parent = this;
                item.SetEntityRef(EntitySetMember.RefMemberId, (Entity)Parent);
            }
Example #3
0
        void IJsonSerializable.WriteToJson(Utf8JsonWriter writer, WritedObjects objrefs)
        {
            var model = Model;
            EntityMemberModel mm;

            for (int i = 0; i < model.Members.Count; i++)
            {
                mm = model.Members[i];
                ref EntityMember m = ref GetMember(mm.Name);
                switch (mm.Type)
                {
                case EntityMemberType.EntityRef:
                    if (m.HasValue)     //注意:无加载值不写入给前端
                    {
                        writer.WritePropertyName(mm.Name);
                        writer.Serialize(m.ObjectValue, objrefs);
                    }
                    break;

                case EntityMemberType.EntitySet:
                    if (m.HasValue)     //注意:无加载值不写入给前端
                    {
                        writer.WritePropertyName(mm.Name);
                        writer.WriteList((IList)m.ObjectValue, objrefs);
                    }
                    break;

                case EntityMemberType.EntityRefDisplayText:
                    if (m.HasValue)     //注意:无加载值不写入给前端
                    {
                        writer.WritePropertyName(mm.Name);
                        writer.WriteStringValue((string)m.ObjectValue);
                    }
                    break;

                case EntityMemberType.DataField:
                    writer.WritePropertyName(mm.Name);
                    if (m.HasValue)
                    {
                        switch (m.ValueType)
                        {
                        case EntityFieldType.Binary:
                            writer.WriteBase64StringValue((byte[])m.ObjectValue); break;

                        case EntityFieldType.Boolean:
                            writer.WriteBooleanValue(m.BooleanValue); break;

                        case EntityFieldType.Byte:
                            writer.WriteNumberValue(m.ByteValue); break;

                        case EntityFieldType.DateTime:
                            writer.WriteStringValue(m.DateTimeValue); break;

                        case EntityFieldType.Decimal:
                            writer.WriteNumberValue(m.DecimalValue); break;

                        case EntityFieldType.Double:
                            writer.WriteNumberValue(m.DoubleValue); break;

                        case EntityFieldType.Enum:
                            writer.WriteNumberValue(m.Int32Value); break;

                        case EntityFieldType.Float:
                            writer.WriteNumberValue(m.FloatValue); break;

                        case EntityFieldType.Guid:
                            writer.WriteStringValue(m.GuidValue); break;

                        case EntityFieldType.EntityId:
                            writer.WriteStringValue((Guid)((EntityId)m.ObjectValue)); break;

                        case EntityFieldType.Int16:
                            writer.WriteNumberValue(m.Int16Value); break;

                        case EntityFieldType.UInt16:
                            writer.WriteNumberValue(m.UInt16Value); break;

                        case EntityFieldType.Int32:
                            writer.WriteNumberValue(m.Int32Value); break;

                        case EntityFieldType.UInt32:
                            writer.WriteNumberValue(m.UInt32Value); break;

                        case EntityFieldType.Int64:
                            writer.WriteNumberValue(m.Int64Value); break;

                        case EntityFieldType.UInt64:
                            writer.WriteStringValue(m.UInt64Value.ToString()); break;         //暂序列化为字符串

                        case EntityFieldType.String:
                            writer.WriteStringValue((string)m.ObjectValue); break;

                        default: throw new NotSupportedException();
                        }
                    }
                    else
                    {
                        writer.WriteNullValue();
                    }
                    break;

                default:
                    throw ExceptionHelper.NotImplemented();
                    //writer.WritePropertyName(m.Name);
                    //writer.Serialize(m.BoxedValue);
                    //break;
                }
            }
Example #4
0
 public static bool IsValueSame(ref EntityMember a, ref EntityMember b)
 {
     return(a.GuidValue == b.GuidValue && a.ObjectValue == b.ObjectValue);
 }