create (props, opts) {
    // Default values for arguments
    props || (props = {})
    opts || (opts = {})
    const originalRecord = props
    let parentRelationMap = {}
    let adapterResponse = {}

    // Fill in "opts" with the Mapper's configuration
    utils._(opts, this)
    opts.adapter = this.getAdapterName(opts)

    opts.op = 'beforeCreate'
    return this._runHook(opts.op, props, opts).then((_value) => {
      // Allow for re-assignment from lifecycle hook
      props = _value !== undefined ? _value : props
      opts.with || (opts.with = [])
      return this._createParentRecordIfRequired(props, opts)
    }).then((relationMap) => {
      parentRelationMap = relationMap
    }).then(() => {
      opts.op = 'create'
      return this._invokeAdapterMethod(opts.op, props, opts)
    }).then((result) => {
      adapterResponse = result
    }).then(() => {
      const createdProps = opts.raw ? adapterResponse.data : adapterResponse

      return this._createOrAssignChildRecordIfRequired(createdProps, {
        opts,
        parentRelationMap,
        originalProps: props
      })
    }).then((createdProps) => {
      return this._commitChanges(originalRecord, createdProps)
    }).then((record) => {
      if (opts.raw) {
        adapterResponse.data = record
      } else {
        adapterResponse = record
      }
      const result = this._end(adapterResponse, opts)
      opts.op = 'afterCreate'
      return this._runHook(opts.op, props, opts, result)
    })
  }
Create and save a new the record using the provided `props`.

{@link Mapper#beforeCreate} will be called before calling the adapter.
{@link Mapper#afterCreate} will be called after calling the adapter.

@example
// Create and save a new blog post
PostMapper.create({
  title: 'Modeling your data',
  status: 'draft'
}).then((post) => {
  console.log(post); // { id: 1234, status: 'draft', ... }
});

@fires Mapper#beforeCreate
@fires Mapper#afterCreate
@method Mapper#create
@param {object} props The properties for the new record.
@param {object} [opts] Configuration options. Refer to the `create` method
of whatever adapter you're using for more configuration options.
@param {boolean} [opts.adapter={@link Mapper#defaultAdapter}] Name of the
adapter to use.
@param {boolean} [opts.noValidate={@link Mapper#noValidate}] See {@link Mapper#noValidate}.
@param {boolean} [opts.notify={@link Mapper#notify}] See {@link Mapper#notify}.
@param {boolean} [opts.raw={@link Mapper#raw}] See {@link Mapper#raw}.
@param {string[]} [opts.with=[]] Relations to create in a cascading
create if `props` contains nested relations. NOT performed in a
transaction. Each nested create will result in another {@link Mapper#create}
or {@link Mapper#createMany} call.
@param {string[]} [opts.pass=[]] Relations to send to the adapter as part
of the payload. Normally relations are not sent.
@returns {Promise} Resolves with the created record.
@since 3.0.0