NHibernate.TransientObjectException : object references an unsaved transient instance

Topics: Core, Customizing Orchard, Writing modules
Dec 5, 2014 at 12:31 PM
Edited Dec 5, 2014 at 12:48 PM
I am getting the following exception upon saving the record in the table:
NHibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing or set cascade action for the property to something that would make it autosave. Type: Orchard.Workflows.Models.WorkflowRecord, Entity: Orchard.Workflows.Models.WorkflowRecord
Here is the code

Models

public class TableA
    {
        public virtual int Id { get; set; }
        public virtual ContentItemRecord ContentItemRecord { get; set;  }
        
    }

public class TableB
    {
        public virtual int Id { get; set; }
        public virtual TableA TableA { get; set; }
        public virtual WorkflowRecord WorkflowRecord { get; set; }
        public virtual ActivityRecord ActivityRecord { get; set; }
        public virtual UserPartRecord UserPartRecord { get; set; }        
    }

Migration:

public class Migrations : DataMigrationImpl {

        public int Create() {
            SchemaBuilder.CreateTable("TableA", table => table
                .Column<int>("Id", column => column.PrimaryKey().Identity())                .Column<int>("ContentItemRecord_Id"));      
SchemaBuilder.CreateTable("TableB", table => table
                .Column<int>("Id", column => column.PrimaryKey().Identity())
                .Column<int>("TableA_Id")
                .Column<int>("WorkflowRecord_Id")
                .Column<int>("ActivityRecord_Id")
                .Column<int>("UserPartRecord_Id"));
            ContentDefinitionManager.AlterPartDefinition("MyPart", part => part.Attachable(true));
            return 1;
        }
    }

Adding Records

private readonly IRepository<TableA> _tableA;  
private readonly IRepository<TableB> _tableB;
public MyConstructor(
IRepository<TableA> tableA,
IRepository<TableB> tableB
)
    {
     _tableA = tableA; 
    _tableB = tableB;                    
     }
var tableA = new TableA
            {
                ContentItemRecord = contentItem.Record                  
            };
_tableA.Create(tableA);
var tableB = new TableB
                        {
                            ActivityRecord = activityContext.Record,
                            WorkflowRecord = workflowContext.Record,
                            LastModified = DateTime.Now,
                            TableA = tableA
                        };
_tableB.Create(tableB);
The exception occurs on adding the record in TableB.

Thanks
Dec 5, 2014 at 1:10 PM
Edited Dec 5, 2014 at 1:10 PM
You have to do exactly what exception has told you.
  1. Flush it
put _tableA.Flush(); after _tableA.Create(tableA);

or
  1. Map as cascade
Use mapping overrides to additionally define that property TableA is cascaded
Dec 8, 2014 at 11:34 AM
Edited Dec 8, 2014 at 11:51 AM
Hello Daniel, Thanks for your time.

I have tried calling Flush() right after Create(TableA), but it didn't work. But I have found what the problem is. As exception shows it has some problem with workflowRecord object. So I inspected this object and the WorfkflowRecord.Id was 0. I tried replacing it with a non-zero number, and it worked. And the recrord was save into the database.

I don't understand why WorkflowRecord is 0. and Event if it is "0" why It gives the above mentioned exception on saving the record.

Thanks,
Developer
Dec 8, 2014 at 1:32 PM
It sounds like the workflow record you're referencing hasn't been stored to the database yet. Find out at which point that record is saved, and save your own record after that.
Marked as answer by cloudsurfer on 12/9/2014 at 3:22 AM