stack overflow when clearing relation (set fk to null)

Posts   
 
    
scotru
User
Posts: 104
Joined: 16-Feb-2006
# Posted on: 27-Jan-2008 03:28:39   

Greetings,

I'm getting a recursive function call (stack overflow) when I try to set fk to null:


        private void btnClearMailbox_Click(object sender, EventArgs e)
        {
            RoomsEntity room = (RoomsEntity)cm.Current;
            if (room==null) return;
            if (room.GetCurrentFieldValue((int)RoomsFieldIndex.MailboxId)==DBNull.Value) return;

            room.SetNewFieldValue((int)RoomsFieldIndex.MailboxId, null);
            room.Save();
            UpdateMailboxes();
            cm.Refresh();
        }

Am I doing this wrong? For context, there are fields mapped on both entities from the relation. The SetNewFieldValue is the crash.

(Self-Servicing, MySQL, Corelabs, LLBLGenPro v1)

Here's an excerpt from the call stack:


    [External Code] 
    Data.dll!Abode.Data.EntityClasses.RoomsEntityBase.SetNewFieldValue(int fieldIndex = 1, object value = null, bool checkForRefetch = false) Line 909 + 0xb bytes  C#
    Data.dll!Abode.Data.EntityClasses.RoomsEntityBase.DesetupSyncMailboxes(bool signalRelatedEntity = true) Line 1247 + 0x13 bytes  C#
    Data.dll!Abode.Data.EntityClasses.RoomsEntityBase.SetupSyncMailboxes(SD.LLBLGen.Pro.ORMSupportClasses.IEntity relatedEntity = {Abode.Data.EntityClasses.MailboxesEntity}) Line 1269 + 0xc bytes C#
    Data.dll!Abode.Data.EntityClasses.RoomsEntityBase.Mailboxes.set(Abode.Data.EntityClasses.MailboxesEntity value = {Abode.Data.EntityClasses.MailboxesEntity}) Line 1758 + 0xa bytes  C#
    Data.dll!Abode.Data.EntityClasses.RoomsEntityBase.GetSingleMailboxes(bool forceFetch = false) Line 752 + 0xd bytes  C#
    Data.dll!Abode.Data.EntityClasses.RoomsEntityBase.Mailboxes.get() Line 1741 + 0xd bytes C#
    Data.dll!Abode.Data.EntityClasses.RoomsEntityBase.MailboxName.get() Line 1789 + 0xb bytes   C#
    [External Code] 
    Data.dll!Abode.Data.EntityClasses.RoomsEntityBase.SetNewFieldValue(int fieldIndex = 1, object value = null, bool checkForRefetch = false) Line 909 + 0xb bytes  C#
    Data.dll!Abode.Data.EntityClasses.RoomsEntityBase.DesetupSyncMailboxes(bool signalRelatedEntity = true) Line 1247 + 0x13 bytes  C#
    Data.dll!Abode.Data.EntityClasses.RoomsEntityBase.SetupSyncMailboxes(SD.LLBLGen.Pro.ORMSupportClasses.IEntity relatedEntity = {Abode.Data.EntityClasses.MailboxesEntity}) Line 1269 + 0xc bytes C#
    Data.dll!Abode.Data.EntityClasses.RoomsEntityBase.Mailboxes.set(Abode.Data.EntityClasses.MailboxesEntity value = {Abode.Data.EntityClasses.MailboxesEntity}) Line 1758 + 0xa bytes  C#
    Data.dll!Abode.Data.EntityClasses.RoomsEntityBase.GetSingleMailboxes(bool forceFetch = false) Line 752 + 0xd bytes  C#
    Data.dll!Abode.Data.EntityClasses.RoomsEntityBase.Mailboxes.get() Line 1741 + 0xd bytes C#
    Data.dll!Abode.Data.EntityClasses.RoomsEntityBase.MailboxName.get() Line 1789 + 0xb bytes   C#
    [External Code] 
    Data.dll!Abode.Data.EntityClasses.RoomsEntityBase.SetNewFieldValue(int fieldIndex = 1, object value = null, bool checkForRefetch = false) Line 909 + 0xb bytes  C#
    Data.dll!Abode.Data.EntityClasses.RoomsEntityBase.DesetupSyncMailboxes(bool signalRelatedEntity = true) Line 1247 + 0x13 bytes  C#
    Data.dll!Abode.Data.EntityClasses.RoomsEntityBase.SetupSyncMailboxes(SD.LLBLGen.Pro.ORMSupportClasses.IEntity relatedEntity = {Abode.Data.EntityClasses.MailboxesEntity}) Line 1269 + 0xc bytes C#
    Data.dll!Abode.Data.EntityClasses.RoomsEntityBase.Mailboxes.set(Abode.Data.EntityClasses.MailboxesEntity value = {Abode.Data.EntityClasses.MailboxesEntity}) Line 1758 + 0xa bytes  C#
    Data.dll!Abode.Data.EntityClasses.RoomsEntityBase.GetSingleMailboxes(bool forceFetch = false) Line 752 + 0xd bytes  C#
    Data.dll!Abode.Data.EntityClasses.RoomsEntityBase.Mailboxes.get() Line 1741 + 0xd bytes C#
    Data.dll!Abode.Data.EntityClasses.RoomsEntityBase.MailboxName.get() Line 1789 + 0xb bytes   C#
    [External Code] 
    Data.dll!Abode.Data.EntityClasses.RoomsEntityBase.SetNewFieldValue(int fieldIndex = 1, object value = null, bool checkForRefetch = false) Line 909 + 0xb bytes  C#
    Data.dll!Abode.Data.EntityClasses.RoomsEntityBase.DesetupSyncMailboxes(bool signalRelatedEntity = true) Line 1247 + 0x13 bytes  C#
    Data.dll!Abode.Data.EntityClasses.RoomsEntityBase.SetupSyncMailboxes(SD.LLBLGen.Pro.ORMSupportClasses.IEntity relatedEntity = {Abode.Data.EntityClasses.MailboxesEntity}) Line 1269 + 0xc bytes C#
    Data.dll!Abode.Data.EntityClasses.RoomsEntityBase.Mailboxes.set(Abode.Data.EntityClasses.MailboxesEntity value = {Abode.Data.EntityClasses.MailboxesEntity}) Line 1758 + 0xa bytes  C#
    Data.dll!Abode.Data.EntityClasses.RoomsEntityBase.GetSingleMailboxes(bool forceFetch = false) Line 752 + 0xd bytes  C#
    Data.dll!Abode.Data.EntityClasses.RoomsEntityBase.Mailboxes.get() Line 1741 + 0xd bytes C#
    Data.dll!Abode.Data.EntityClasses.RoomsEntityBase.MailboxName.get() Line 1789 + 0xb bytes   C#
    [External Code] 
    Data.dll!Abode.Data.EntityClasses.RoomsEntityBase.SetNewFieldValue(int fieldIndex = 1, object value = null, bool checkForRefetch = false) Line 909 + 0xb bytes  C#
    Data.dll!Abode.Data.EntityClasses.RoomsEntityBase.DesetupSyncMailboxes(bool signalRelatedEntity = true) Line 1247 + 0x13 bytes  C#
    Data.dll!Abode.Data.EntityClasses.RoomsEntityBase.SetupSyncMailboxes(SD.LLBLGen.Pro.ORMSupportClasses.IEntity relatedEntity = {Abode.Data.EntityClasses.MailboxesEntity}) Line 1269 + 0xc bytes C#
    Data.dll!Abode.Data.EntityClasses.RoomsEntityBase.Mailboxes.set(Abode.Data.EntityClasses.MailboxesEntity value = {Abode.Data.EntityClasses.MailboxesEntity}) Line 1758 + 0xa bytes  C#
    Data.dll!Abode.Data.EntityClasses.RoomsEntityBase.GetSingleMailboxes(bool forceFetch = false) Line 752 + 0xd bytes  C#
    Data.dll!Abode.Data.EntityClasses.RoomsEntityBase.Mailboxes.get() Line 1741 + 0xd bytes C#
    Data.dll!Abode.Data.EntityClasses.RoomsEntityBase.MailboxName.get() Line 1789 + 0xb bytes   C#
    [External Code] 
    Data.dll!Abode.Data.EntityClasses.RoomsEntityBase.SetNewFieldValue(int fieldIndex = 1, object value = null, bool checkForRefetch = false) Line 909 + 0xb bytes  C#
    Data.dll!Abode.Data.EntityClasses.RoomsEntityBase.DesetupSyncMailboxes(bool signalRelatedEntity = true) Line 1247 + 0x13 bytes  C#
    Data.dll!Abode.Data.EntityClasses.RoomsEntityBase.SetupSyncMailboxes(SD.LLBLGen.Pro.ORMSupportClasses.IEntity relatedEntity = {Abode.Data.EntityClasses.MailboxesEntity}) Line 1269 + 0xc bytes C#
    Data.dll!Abode.Data.EntityClasses.RoomsEntityBase.Mailboxes.set(Abode.Data.EntityClasses.MailboxesEntity value = {Abode.Data.EntityClasses.MailboxesEntity}) Line 1758 + 0xa bytes  C#
    Data.dll!Abode.Data.EntityClasses.RoomsEntityBase.GetSingleMailboxes(bool forceFetch = false) Line 752 + 0xd bytes  C#
    Data.dll!Abode.Data.EntityClasses.RoomsEntityBase.Mailboxes.get() Line 1741 + 0xd bytes C#
    Data.dll!Abode.Data.EntityClasses.RoomsEntityBase.MailboxName.get() Line 1789 + 0xb bytes   C#
    [External Code] 
    Data.dll!Abode.Data.EntityClasses.RoomsEntityBase.SetNewFieldValue(int fieldIndex = 1, object value = null, bool checkForRefetch = false) Line 909 + 0xb bytes  C#
    Data.dll!Abode.Data.EntityClasses.RoomsEntityBase.DesetupSyncMailboxes(bool signalRelatedEntity = true) Line 1247 + 0x13 bytes  C#
    Data.dll!Abode.Data.EntityClasses.RoomsEntityBase.SetupSyncMailboxes(SD.LLBLGen.Pro.ORMSupportClasses.IEntity relatedEntity = {Abode.Data.EntityClasses.MailboxesEntity}) Line 1269 + 0xc bytes C#
    Data.dll!Abode.Data.EntityClasses.RoomsEntityBase.Mailboxes.set(Abode.Data.EntityClasses.MailboxesEntity value = {Abode.Data.EntityClasses.MailboxesEntity}) Line 1758 + 0xa bytes  C#
    Data.dll!Abode.Data.EntityClasses.RoomsEntityBase.GetSingleMailboxes(bool forceFetch = false) Line 752 + 0xd bytes  C#
    Data.dll!Abode.Data.EntityClasses.RoomsEntityBase.Mailboxes.get() Line 1741 + 0xd bytes C#
    Data.dll!Abode.Data.EntityClasses.RoomsEntityBase.MailboxName.get() Line 1789 + 0xb bytes   C#
    [External Code] 
    Data.dll!Abode.Data.EntityClasses.RoomsEntityBase.SetNewFieldValue(int fieldIndex = 1, object value = null, bool checkForRefetch = false) Line 909 + 0xb bytes  C#
    Data.dll!Abode.Data.EntityClasses.RoomsEntityBase.DesetupSyncMailboxes(bool signalRelatedEntity = true) Line 1247 + 0x13 bytes  C#
    Data.dll!Abode.Data.EntityClasses.RoomsEntityBase.SetupSyncMailboxes(SD.LLBLGen.Pro.ORMSupportClasses.IEntity relatedEntity = {Abode.Data.EntityClasses.MailboxesEntity}) Line 1269 + 0xc bytes C#
    Data.dll!Abode.Data.EntityClasses.RoomsEntityBase.Mailboxes.set(Abode.Data.EntityClasses.MailboxesEntity value = {Abode.Data.EntityClasses.MailboxesEntity}) Line 1758 + 0xa bytes  C#
    Data.dll!Abode.Data.EntityClasses.RoomsEntityBase.GetSingleMailboxes(bool forceFetch = false) Line 752 + 0xd bytes  C#
    Data.dll!Abode.Data.EntityClasses.RoomsEntityBase.Mailboxes.get() Line 1741 + 0xd bytes C#
    Data.dll!Abode.Data.EntityClasses.RoomsEntityBase.MailboxName.get() Line 1789 + 0xb bytes   C#
    [External Code] 
    Data.dll!Abode.Data.EntityClasses.RoomsEntityBase.SetNewFieldValue(int fieldIndex = 1, object value = null, bool checkForRefetch = false) Line 909 + 0xb bytes  C#
    Data.dll!Abode.Data.EntityClasses.RoomsEntityBase.DesetupSyncMailboxes(bool signalRelatedEntity = true) Line 1247 + 0x13 bytes  C#
    Data.dll!Abode.Data.EntityClasses.RoomsEntityBase.SetupSyncMailboxes(SD.LLBLGen.Pro.ORMSupportClasses.IEntity relatedEntity = {Abode.Data.EntityClasses.MailboxesEntity}) Line 1269 + 0xc bytes C#
    Data.dll!Abode.Data.EntityClasses.RoomsEntityBase.Mailboxes.set(Abode.Data.EntityClasses.MailboxesEntity value = {Abode.Data.EntityClasses.MailboxesEntity}) Line 1758 + 0xa bytes  C#
    Data.dll!Abode.Data.EntityClasses.RoomsEntityBase.GetSingleMailboxes(bool forceFetch = false) Line 752 + 0xd bytes  C#


Otis avatar
Otis
LLBLGen Pro Team
Posts: 39588
Joined: 17-Aug-2003
# Posted on: 27-Jan-2008 11:12:53   
Frans Bouma | Lead developer LLBLGen Pro
scotru
User
Posts: 104
Joined: 16-Feb-2006
# Posted on: 27-Jan-2008 19:55:45   

Sorry, it's 1.0.20051.60224

Thanks!

Otis avatar
Otis
LLBLGen Pro Team
Posts: 39588
Joined: 17-Aug-2003
# Posted on: 27-Jan-2008 20:56:51   

scotru wrote:

Sorry, it's 1.0.20051.60224

Thanks!

That's not the newest, although I can't find a bugfix which is related to this issue. I pressume it's winforms we're talking about. Is this occuring when you call cm.Refresh? If so, if you comment out that call, what behavior do you miss which is fulfilled with cm.Refresh? Normally you don't need to call the Refresh method of the currencymanager as events already take care of this.

Frans Bouma | Lead developer LLBLGen Pro
scotru
User
Posts: 104
Joined: 16-Feb-2006
# Posted on: 27-Jan-2008 22:19:16   

Grabbing the latest build now...

Yes, winforms. No, the exception comes before cm.Refresh in the SetNewFieldValue line itself.

Walaa avatar
Walaa
Support Team
Posts: 14946
Joined: 21-Aug-2005
# Posted on: 28-Jan-2008 10:15:52   

How did you find the latest version? Does it work or do you get the same exception?

Otis avatar
Otis
LLBLGen Pro Team
Posts: 39588
Joined: 17-Aug-2003
# Posted on: 29-Jan-2008 11:10:55   

I think it's the databinding, though I still find it odd what happens. .NET 1.1 with latest service pack? Or .NET 2.0 ?

The sync/desync doesn't access the property though the stacktrace shows that lazy loading is triggered over and over again.

I can't repro it without databinding:


[Test]
public void DesyncMtoOneTest()
{
    OrderEntity o = new OrderEntity(10254);
    CustomerEntity c = o.Customers;
    Assert.IsNotNull(c);
    Assert.IsFalse(c.IsNew);

    // reset fk
    o.SetNewFieldValue((int)OrderFieldIndex.CustomerId, null);
    Assert.IsNull(o.Fields[(int)OrderFieldIndex.CustomerId].CurrentValue);
}

(.NET 1.1, LLBLGen Pro v1.0.2005.1) So without more details about the specific databinding scenario you're using it in (grid/combobox etc.) we can't proceed further.

Frans Bouma | Lead developer LLBLGen Pro