fengd fengd - 1 month ago 17
C# Question

EmitMapper's List Mapping Issue with Collections

The source class:

public class Post
{
public long ID { get; set; }

[Column(TypeName="nvarchar")]
[Required]
[StringLength(250)]
public string Name { get; set; }

[Column(TypeName="varchar")]
[StringLength(250)]
public string UrlName { get; set; }

[Column(TypeName="ntext")]
public string Excerpt { get; set; }

[Column(TypeName="ntext")]
[Required]
public string Content { get; set; }

public DateTime PostedTime { get; set; }
public DateTime? PublishedTime { get; set; }
public DateTime? LastUpdatedTime { get; set; }
public bool IsPublished { get; set; }

public virtual List<Category> Categories { get; set; }
public virtual List<Comment> Comments { get; set; }
public virtual List<Tag> Tags { get; set; }
}


the destination class

public class Post : Model
{
public long ID { get; set; }
public string Name { get; set; }
public string UrlName { get; set; }
public string Excerpt { get; set; }
public string Content { get; set; }
public DateTime PostedTime { get; set; }
public DateTime LastCommentedTime { get; set; }
public bool IsPublished { get; set; }

public List<Category> Category { get; set; }
public List<Comment> Comments { get; set; }
public List<Tag> Tags { get; set; }
}


I try using EmitMapper to map from each other; when mapping from source to desction, here is the code sampleļ¼š

[TestMethod]
public void ShouleMapEntityToModel()
{
Post eP = new Post();
eP.ID = 2;
eP.Comments = new List<Comment>();

eP.Comments.Add(new Comment()
{
ID = 2,
Author = "derek"
});

var mP = eP.Map<Post, mBlog.Core.Models.Post>();

Assert.IsNotNull(mP);
Assert.AreEqual(1, mP.Comments.Count());
}


and I got an exception,

Test method mBlog.Test.EmitMapperTest.ShouleMapEntityToModel threw exception:
System.Exception: Constructor for types [] not found in System.Collections.Generic.IList`1[[mBlog.Core.Models.Post, mBlog.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]

Answer

I had the same problem, but I have found the solution. Don't user Lists for your destination object. If you use simple arrays in your mBlog.Core.Models.Post object you should get a nicely filled object. So your destination class should look like:

public class Post : Model
{
    public long ID { get; set; }
    public string Name { get; set; }
    public string UrlName { get; set; }
    public string Excerpt { get; set; }
    public string Content { get; set; }
    public DateTime PostedTime { get; set; }
    public DateTime LastCommentedTime { get; set; }
    public bool IsPublished { get; set; }

    public Category[] Category { get; set; }
    public Comment[] Comments { get; set; }
    public Tag[] Tags { get; set; }
}