Five New Optimizely Certifications are Here! Validate your expertise and advance your career with our latest certification exams. Click here to find out more

Generic collection in Dynamic Data Store

Vote:
 

Hi,

I'm trying to store a generic collection in the dynamic data store but fails to do that. I have created a Comment class consisting of three string properties and a Comments class which is a generic collection (List) of data type Comment.

First I have created a pageobjectmanager:
pom = new PageObjectManager(CurrentPage);

In the page OnLoad event handler I do this:
comments = pom.Load<Comments>("comments");

When I store the values I do this:
pom.Save("comments", comments);

Even though the comments list has a comment when I store the value, after reloading the page its value is gone. Does anyone have a clue why this happens or do you perhaps know of any other way to store a collection in the DDS?

#38706
Apr 20, 2010 8:16
Vote:
 

I do exactly what you are trying to accomplish.

Remeber to use the Identity from the IDynamicDatainterface on the objects.

someobject.ID = Identity.NewIdentity(Guid.NewGuid());

Regards,
Morten

#38707
Apr 20, 2010 8:38
Vote:
 

Thanks for your reply Morten,

unfortunately I still don't understand what I have to do to make it work, could you please try to explain it more thoroughly?

Many thanks in advance!

#38711
Apr 20, 2010 13:15
Vote:
 

I had something like this happen too.  When I reloaded the page, PageObjectManager had a record of the key, but the value was always NULL.

Is this what's happening to you too?  I have no solution, sadly.

#38727
Apr 20, 2010 15:13
Vote:
 

Hi Deane,

that is exactly what happens to me. Anyone who has a solution to this?

#38735
Apr 20, 2010 15:30
Vote:
 

Jens:

I have it partially figured out --

In the class that you're storing, you have to implement IDynamicData.  When you do this, you just have to add this to your class:

public EPiServer.Data.Identity Id { get; set; }

I did this with a custom class, and it worked perfectly.

(My problem, however, is -- how do you store a primitive?  I just want to store an int.  Since I can't implement an interface on a primitive, is it impossible to store a primitive?)

Deane

#38749
Apr 21, 2010 6:46
Vote:
 

DDS takes the approach to save an object by saving all its properties, and by default it
saves all "simple" (non-indexed) properties (not fields) that are public and has a getter and a setter.

When you pass in a List<T>, the only property that fullfills this is the Capacity property,
and the actual items in the list wont get saved.

You would need to wrap the List<T> in your own class, and then pass it to DDS save(),
something like this:

public class CommentsWrap
{
   public List<Comment> Comments { get; sst; }
}

Regards,
Johan

#38752
Edited, Apr 21, 2010 10:16
Vote:
 

Here is how I've done it:

 

   public class TheList : IDynamicData
    {
        #region IDynamicData Members

        public Identity Id { get; set; }

        #endregion
        public List<TheItem> Items { get; set; }
    }

    public class TheItem : IDynamicData
    {
        public string MyString { get; set; }
        public int MyItn { get; set; }

        #region IDynamicData Members
        public Identity Id { get; set; }
    }

 

Regards,
Morten

#38753
Apr 21, 2010 10:24
Vote:
 

Thanks all for your answers!

I don't have time to test this right now but as Morten already has a working solution I'm pretty sure this will solve my problem and therefore I will mark this thread as answered.

Thanks once again!

#38754
Apr 21, 2010 10:38
Vote:
 

All:

So, can you store primitives in DDS?  Like an int?  Or would have to wrap my int in a custom class that implements IDynamicData and exposes the int as a public property?

Deane

#38758
Apr 21, 2010 14:20
Vote:
 

No, you for the same reason as for the List<T> case, you cannot store primitives directly in DDS.

You need to encapsulate it into a type, and expose it through a property like so:

public class MyClass
{
   public int MyInt { get; set; }
}

/johan

#38759
Apr 21, 2010 14:22
Vote:
 

Content removed since I was spreading lies with regards to primitives ;-)

#38760
Edited, Apr 21, 2010 14:26
Vote:
 

There's actually a second limitation in play here. You can't store generics - at least not as a PageObjects or in "typed" stores - since their generated store names include forbidden characters.

#38890
Apr 22, 2010 8:15
Vote:
 

Not sure what you mean here Magnus,

The code I posed a few post up, with a Genering list of another class works perfect.
I might be missing your point here though :-)

//Morten

#38891
Apr 22, 2010 8:26
Vote:
 

Yeah, you're storing objects of a class called TheList. You couldn't store your List<TheClass> directly because it lacks public properties. But you could not even store a TheList<T> if you wanted that for some reason (for example to create a generic metaclass for lists which has a property storing the actual list just like in your example). This doesn't stop at lists or list-like objects of course, it applies to all generic classes.

#38893
Apr 22, 2010 8:31
Vote:
 

Ah that's what you meant :-)

//Morten

#38894
Apr 22, 2010 8:34
This thread is locked and should be used for reference only. Please use the Episerver CMS 7 and earlier versions forum to open new discussions.
* You are NOT allowed to include any hyperlinks in the post because your account hasn't associated to your company. User profile should be updated.