Csla.DataPortalException: ChildDataPortal.Update failed on the server

Csla.DataPortalException: ChildDataPortal.Update failed on the server

Old forum URL: forums.lhotka.net/forums/t/10713.aspx


7designs posted on Monday, September 26, 2011

Initially had a problem when trying to save a datagridview that was bound  using binding source(http://www.lhotka.net/Article.aspx?area=4&id=91e15def-fa1c-4236-86b5-b204bfc4a0aa). That was resolved by overriding DataPortal_Update() method in BusinessListBase(http://forums.lhotka.net/forums/p/6398/34829.aspx). but now I am getting another error.

 

Here is where it breaks because mh.DynamicMethod is null:

public static object CallMethod(object obj, string method, params object[] parameters)
    {
      var mh = GetCachedMethod(obj, method, parameters);
      if (mh == null || mh.DynamicMethod == null)
        throw new NotImplementedException(method + " " + Resources.MethodNotImplemented);
      return CallMethod(obj, mh, parameters);
    }

Exception Message:

{"DataPortal.Update failed (Csla.DataPortalException: ChildDataPortal.Update failed on the server ---> System.NotImplementedException: Child_Update not implemented\r\n   at Csla.Reflection.MethodCaller.CallMethod(Object obj, String method, Object[] parameters) in C:\\Users\\ddavis\\Desktop\\cslacs-3.8.4-100811\\cslacs\\Csla\\Reflection\\MethodCaller.cs:line 269\r\n   at Csla.Reflection.LateBoundObject.CallMethod(String method, Object[] parameters) in C:\\Users\\ddavis\\Desktop\\cslacs-3.8.4-100811\\cslacs\\Csla\\Reflection\\LateBoundObject.cs:line 86\r\n   at Csla.Server.ChildDataPortal.Update(Object obj, Object[] parameters) in C:\\Users\\ddavis\\Desktop\\cslacs-3.8.4-100811\\cslacs\\Csla\\Server\\ChildDataPortal.cs:line 207\r\n   --- End of inner exception stack trace ---\r\n   at Csla.Reflection.MethodCaller.CallMethod(Object obj, String method, Object[] parameters) in C:\\Users\\ddavis\\Desktop\\cslacs-3.8.4-100811\\cslacs\\Csla\\Reflection\\MethodCaller.cs:line 269\r\n   at Csla.Reflection.LateBoundObject.CallMethod(String method, Object[] parameters) in C:\\Users\\ddavis\\Desktop\\cslacs-3.8.4-100811\\cslacs\\Csla\\Reflection\\LateBoundObject.cs:line 86\r\n   at Csla.Server.ChildDataPortal.Update(Object obj, Object[] parameters) in C:\\Users\\ddavis\\Desktop\\cslacs-3.8.4-100811\\cslacs\\Csla\\Server\\ChildDataPortal.cs:line 207\r\n   at Csla.Server.ChildDataPortal.Update(Object obj, Object[] parameters) in C:\\Users\\ddavis\\Desktop\\cslacs-3.8.4-100811\\cslacs\\Csla\\Server\\ChildDataPortal.cs:line 258\r\n   at Csla.DataPortal.UpdateChild(Object child, Object[] parameters) in C:\\Users\\ddavis\\Desktop\\cslacs-3.8.4-100811\\cslacs\\Csla\\DataPortal.cs:line 939\r\n   at Csla.BusinessListBase`2.Child_Update(Object[] parameters) in C:\\Users\\ddavis\\Desktop\\cslacs-3.8.4-100811\\cslacs\\Csla\\BusinessListBase.cs:line 966\r\n   at Medflow.DataAccess.MFFACILITIESList.DataPortal_Update() in C:\\SSUPDATES\\NET 2.0\\DLLs\\MedflowDataAccess\\Code\\Collections\\MFFACILITIESList.DataAccess.cs:line 73\r\n   at dm(Object , Object[] )\r\n   at Csla.Reflection.MethodCaller.CallMethod(Object obj, DynamicMethodHandle methodHandle, Object[] parameters) in C:\\Users\\ddavis\\Desktop\\cslacs-3.8.4-100811\\cslacs\\Csla\\Reflection\\MethodCaller.cs:line 357)"}

 

Stack Trace:

at Csla.Reflection.MethodCaller.CallMethod(Object obj, String method, Object[] parameters) in C:\Users\ddavis\Desktop\cslacs-3.8.4-100811\cslacs\Csla\Reflection\MethodCaller.cs:line 269
   at Csla.Reflection.LateBoundObject.CallMethod(String method, Object[] parameters) in C:\Users\ddavis\Desktop\cslacs-3.8.4-100811\cslacs\Csla\Reflection\LateBoundObject.cs:line 86
   at Csla.Server.ChildDataPortal.Update(Object obj, Object[] parameters) in C:\Users\ddavis\Desktop\cslacs-3.8.4-100811\cslacs\Csla\Server\ChildDataPortal.cs:line 207
   at Csla.Server.ChildDataPortal.Update(Object obj, Object[] parameters) in C:\Users\ddavis\Desktop\cslacs-3.8.4-100811\cslacs\Csla\Server\ChildDataPortal.cs:line 258
   at Csla.DataPortal.UpdateChild(Object child, Object[] parameters) in C:\Users\ddavis\Desktop\cslacs-3.8.4-100811\cslacs\Csla\DataPortal.cs:line 939
   at Csla.BusinessListBase`2.Child_Update(Object[] parameters) in C:\Users\ddavis\Desktop\cslacs-3.8.4-100811\cslacs\Csla\BusinessListBase.cs:line 966
   at Medflow.DataAccess.MFFACILITIESList.DataPortal_Update() in C:\SSUPDATES\NET 2.0\DLLs\MedflowDataAccess\Code\Collections\MFFACILITIESList.DataAccess.cs:line 73
   at dm(Object , Object[] )
   at Csla.Reflection.MethodCaller.CallMethod(Object obj, DynamicMethodHandle methodHandle, Object[] parameters) in C:\Users\ddavis\Desktop\cslacs-3.8.4-100811\cslacs\Csla\Reflection\MethodCaller.cs:line 357
   at Csla.Reflection.MethodCaller.CallMethod(Object obj, DynamicMethodHandle methodHandle, Object[] parameters) in C:\Users\ddavis\Desktop\cslacs-3.8.4-100811\cslacs\Csla\Reflection\MethodCaller.cs:line 361
   at Csla.Reflection.MethodCaller.CallMethod(Object obj, String method, Object[] parameters) in C:\Users\ddavis\Desktop\cslacs-3.8.4-100811\cslacs\Csla\Reflection\MethodCaller.cs:line 270
   at Csla.Reflection.LateBoundObject.CallMethod(String method) in C:\Users\ddavis\Desktop\cslacs-3.8.4-100811\cslacs\Csla\Reflection\LateBoundObject.cs:line 70
   at Csla.Server.SimpleDataPortal.Update(Object obj, DataPortalContext context) in C:\Users\ddavis\Desktop\cslacs-3.8.4-100811\cslacs\Csla\Server\SimpleDataPortal.cs:line 230
   at Csla.DataPortal.Update(Object obj) in C:\Users\ddavis\Desktop\cslacs-3.8.4-100811\cslacs\Csla\DataPortal.cs:line 480
   at Csla.DataPortal.Update[T](T obj) in C:\Users\ddavis\Desktop\cslacs-3.8.4-100811\cslacs\Csla\DataPortal.cs:line 336
   at Csla.BusinessListBase`2.Save() in C:\Users\ddavis\Desktop\cslacs-3.8.4-100811\cslacs\Csla\BusinessListBase.cs:line 1027
   at MFFacilitiesBL.Facilities.SaveForm(BindingSource bsFacilities, Boolean rebind) in C:\SSUPDATES\NET 2.0\DLLs\MFFacilitiesBL\Code\Facilities.cs:line 55

JonnyBee replied on Monday, September 26, 2011

Hi,

Looks like the list item in Medflow.DataAccess.MFFACILITIESList does not implement a Child_Update method with the expected signature (parameters).

7designs replied on Monday, September 26, 2011

No it does not.  According to this article(http://forums.lhotka.net/forums/p/6398/34829.aspx) I only needed to override DataPortal_Update to call Child_Update().  Is there something more that needs to be done?

 

 protected override void DataPortal_Update()
        {
            using (SqlConnection connection = new SqlConnection(ADOHelper.ConnectionString))
            {
                connection.Open();
                Child_Update();
            }

        }

JonnyBee replied on Monday, September 26, 2011

This is most likely the code you call in BusinessListBase:

    protected virtual void Child_Update(params object[] parameters)
    {
      var oldRLCE = this.RaiseListChangedEvents;
      this.RaiseListChangedEvents = false;
      try
      {
        foreach (var child in DeletedList)
          DataPortal.UpdateChild(child, parameters);
        DeletedList.Clear();
 
        foreach (var child in this)
          if (child.IsDirty) DataPortal.UpdateChild(child, parameters);
      }
      finally
      {
        this.RaiseListChangedEvents = oldRLCE;
      }
    }

 

And the DataPortal.UpdateChild will in turn call ChildDataPortal.Update (semantic code shown below) for each Deleted item or IsDirty item:

           if (busObj.IsDeleted)
          {
            if (!busObj.IsNew)
            {
              // tell the object to delete itself
              lb.CallMethod("Child_DeleteSelf", parameters);
            }
            lb.CallMethodIfImplemented("MarkNew"); 
          }
          else
          {
            if (busObj.IsNew)
            {
              // tell the object to insert itself
              lb.CallMethod("Child_Insert", parameters);

            }
            else
            {
              // tell the object to update itself
              lb.CallMethod("Child_Update", parameters);
            }
            if (target != null)
              target.MarkOld();
            else
              lb.CallMethodIfImplemented("MarkOld");
          }

The point being that your items class in the BusinessList must implement these 3 methods to save itself:

Now your code in the list calls Child_Update with no parameters (like a parentId from the parent object for relationship) so for your existing code these methods must exist with no parameters.

 

Copyright (c) Marimer LLC