internal DataRecordInfo(TypeUsage metadata)
        {
            IBaseList <EdmMember> structuralMembers = TypeHelpers.GetAllStructuralMembers(metadata);

            System.Data.Entity.Core.Common.FieldMetadata[] fieldMetadataArray = new System.Data.Entity.Core.Common.FieldMetadata[structuralMembers.Count];
            for (int ordinal = 0; ordinal < fieldMetadataArray.Length; ++ordinal)
            {
                EdmMember fieldType = structuralMembers[ordinal];
                fieldMetadataArray[ordinal] = new System.Data.Entity.Core.Common.FieldMetadata(ordinal, fieldType);
            }
            this._fieldMetadata = new ReadOnlyCollection <System.Data.Entity.Core.Common.FieldMetadata>((IList <System.Data.Entity.Core.Common.FieldMetadata>)fieldMetadataArray);
            this._metadata      = metadata;
        }
        protected void UpdateRecordTrackingMark()
        {
            //Guid user_uid = BaseDB.SessionContext.Current.ActiveUser.UserUid;
            Guid user_uid = (BaseDB.SessionContext.Current == null || BaseDB.SessionContext.Current.ActiveUser == null) ? Guid.Empty : BaseDB.SessionContext.Current.ActiveUser.UserUid;
            var  manager  = ((IObjectContextAdapter)db).ObjectContext.ObjectStateManager;
            var  entries  = from e in manager.GetObjectStateEntries(
                System.Data.Entity.EntityState.Added | System.Data.Entity.EntityState.Modified)
                            where e.Entity != null
                            select e;

            foreach (var entry in entries)
            {
                var fieldMetaData = entry.CurrentValues.DataRecordInfo.FieldMetadata;
                System.Data.Entity.Core.Common.FieldMetadata updatedAtField = fieldMetaData
                                                                              .Where(f => f.FieldType.Name == "updated_at").FirstOrDefault();
                System.Data.Entity.Core.Common.FieldMetadata updatedByField = fieldMetaData
                                                                              .Where(f => f.FieldType.Name == "updated_by").FirstOrDefault();


                System.Data.Entity.Core.Common.FieldMetadata insertedAtField = fieldMetaData
                                                                               .Where(f => f.FieldType.Name == "inserted_at").FirstOrDefault();
                System.Data.Entity.Core.Common.FieldMetadata insertedByField = fieldMetaData
                                                                               .Where(f => f.FieldType.Name == "inserted_by").FirstOrDefault();


                if (entry.State == System.Data.Entity.EntityState.Added)
                {
                    if (insertedAtField.FieldType != null)
                    {
                        if (insertedAtField.FieldType.TypeUsage.EdmType.Name == PrimitiveTypeKind.DateTime.ToString())
                        {
                            entry.CurrentValues.SetDateTime(insertedAtField.Ordinal, DateTime.UtcNow);
                        }
                    }

                    if (insertedByField.FieldType != null)
                    {
                        if (insertedByField.FieldType.TypeUsage.EdmType.Name == PrimitiveTypeKind.Guid.ToString())
                        {
                            entry.CurrentValues.SetGuid(insertedByField.Ordinal, user_uid);
                        }
                    }
                }
                if (entry.State == System.Data.Entity.EntityState.Modified)
                {
                    if (updatedAtField.FieldType != null)
                    {
                        if (updatedAtField.FieldType.TypeUsage.EdmType.Name == PrimitiveTypeKind.DateTime.ToString())
                        {
                            entry.CurrentValues.SetDateTime(updatedAtField.Ordinal, DateTime.UtcNow);
                        }
                    }

                    if (updatedByField.FieldType != null)
                    {
                        if (updatedByField.FieldType.TypeUsage.EdmType.Name == PrimitiveTypeKind.Guid.ToString())
                        {
                            entry.CurrentValues.SetGuid(updatedByField.Ordinal, user_uid);
                        }
                    }
                }
            }
        }