With a non-assigned id, there is a value reserved for non-persistent objects. With int, this is 0. Depending on the ID value, AR decides whether to use INSERT (id == 0) or UPDATE (id != 0). If you use assigned IDs, you have to set the ID, so AR cannot make any assumptions based on it. If an id is assigned 23, it can be either an existing or a non-existing record.
Now when you are cascading, you don't know whether the linked object is already in the database. You might call Save or Update to specify it, for the root object, but not for the linked objects. As a result, there is no cascading with assigned IDs. Understood now? -Markus 2009/6/2 raghavsri <[email protected]>: > > Hi thanks for the reply > its not very clear to me.. it sounds like ,when cascaded record > exists.. we cannot use assigned attribute.. > > On Jun 1, 10:51 pm, Markus Zywitza <[email protected]> wrote: >> With assigned IDs, AR cannot know whether the cascaded record exists. >> It tries to update, but doesn't find any row for updating. It also >> cannot assume a new row because the row count of 0 may also indicate a >> stale object due to a version or timestamp field (concurrent change >> with optimistic locking). >> >> -Markus >> >> 2009/6/1 raghavsri <[email protected]>: >> >> >> >> >> >> > I have created three classes parent ,child and grandchild and also I >> > have established relationship among them using, BelongsTo and HasMany >> > attributes provided by theActiverecord. I have set Primary key >> > attribute as native.Cascade is set to All and inverse to false. >> >> > When I execute parent.create().. it is saving parent,child and >> > grandchild. >> >> > But when I use Primary key attribute as assigned.. and execute >> > parent.Create(). It is throwing an exception as “unexpected row count >> > is 0: expected row is 1:” >> >> > Please let me know , what is the procedure to use assigned >> > attribute . >> >> > namespace ActiveRecordcheckcascade >> > { >> > class Program >> > { >> > static void Main(string[] args) >> > { >> > ActiveRecordStarter.Initialize(typeof(Parent).Assembly, >> > ActiveRecordSectionHandler.Instance); >> > //execute this only once.. to crate tables.from next executtion >> > //it is not required >> > ActiveRecordStarter.CreateSchema(); >> > Parent oParent = new Parent(); >> > Children oChild = new Children(); >> > GrandChild oGrandChild = new GrandChild(); >> >> > oChild.CID = 123; >> > oParent.PID = 124; >> > oGrandChild.GCID = 123; >> >> > IList<Children> oChildLists = new List<Children>(); >> > IList<GrandChild> oGrandChildList = new List<GrandChild>(); >> > oChildLists.Add(oChild); >> > oGrandChildList.Add(oGrandChild); >> >> > oParent.SetChildren(oChildLists); >> > oChild.SetGrandChild(oGrandChildList); >> >> > oParent.Create(); >> > } >> > } >> >> > [ActiveRecord] >> > public class Parent:ActiveRecordBase<Parent> >> > { >> > private long pid; >> > private IList< Children> oChildList; >> >> > public Parent() >> > { >> > oChildList = new List<Children>(); >> > } >> >> > [PrimaryKey(Generator = PrimaryKeyType.Assigned, Access = >> > PropertyAccess.Property)] >> > public long PID >> > {get {return pid;} >> > set { pid = value; } >> > } >> >> > [HasMany(Table = "Children", ColumnKey = "PID", Inverse = false, >> > Cascade = ManyRelationCascadeEnum.All)] >> > public IList<Children> Children { get { return oChildList; } set >> > { oChildList = value; } } >> >> > public void SetChildren(IList<Children> oChilds) >> > { >> > oChildList = oChilds; >> > } >> > } >> >> > [ActiveRecord] >> > public class Children:ActiveRecordBase<Children> >> > { >> > private int cid;//child id >> > private IList<GrandChild> ograndChildList; >> >> > public Children() >> > { >> > ograndChildList = new List<GrandChild>(); >> > } >> >> > [PrimaryKey(Generator = >> > PrimaryKeyType.Assigned,Access=PropertyAccess.Property)] >> > public int CID >> > { get { return cid; } set { cid = value; } } >> >> > [HasMany(Table = "GrandChildre", ColumnKey = "CID", Inverse = false, >> > Cascade = ManyRelationCascadeEnum.All)] >> > public IList<GrandChild> GrandChildList { get { return >> > ograndChildList; } set { ograndChildList = value; } } >> >> > [BelongsTo("PID")] >> > public Parent PID { get ; set; } >> >> > public void SetGrandChild(IList<GrandChild> ograndChilds) >> > { >> > ograndChildList = ograndChilds; >> > } >> > } >> >> > [ActiveRecord] >> > public class GrandChild : ActiveRecordBase<GrandChild> >> > { >> > private int gcid;// grand child id >> > [PrimaryKey(Generator = >> > PrimaryKeyType.Assigned,Access=PropertyAccess.Property)] >> > public int GCID >> > { get { return gcid; } set { gcid = value; } } >> >> > [BelongsTo("CID")] >> > public Children grandchildparent { get; set; } >> >> > }- Hide quoted text - >> >> - Show quoted text - > > > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Castle Project Users" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/castle-project-users?hl=en -~----------~----~----~----~------~----~------~--~---
