/// <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; } } }
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); }
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; } }
public static bool IsValueSame(ref EntityMember a, ref EntityMember b) { return(a.GuidValue == b.GuidValue && a.ObjectValue == b.ObjectValue); }