Refactor data tranfer object and model T_PROJECT is the class that will be retrieve data from linq to sql and ProjectOwnerDataFields is the class that will be used to show data in view. in edit mode i have to get value from model and send it back like this. is there anyway to refactor this and remove the reverse duplication on ProjectOwnerDataFields and UpdateToModel ?

    public class ProjectOwnerDataFields
    {
        public int Id { get; set; }
        public string CompanyName { get; set; }
        public string ContactPerson { get; set; }
        public string CountryIsoLetter { get; set; }
        public string Phone { get; set; }
        public string Email { get; set; }
        public string Fax { get; set; }
        public string Location { get; set; }
        public string Province { get; set; }
        public string Remark { get; set; }

        public string CountryFullName
        {
            get
            {
                if (String.IsNullOrEmpty(this.CountryIsoLetter) == false)
                {
                    return new RegionInfo(this.CountryIsoLetter).EnglishName;
                }

                return "";
            }
        }

        public ProjectOwnerDataFields()
        {

        }

        public ProjectOwnerDataFields(T_PROJECT project)
        {
            this.Id                =     project.proj_owner_id            ;
            this.CompanyName       =     project.proj_owner               ;
            this.ContactPerson     =     project.proj_owner_contact       ;
            this.CountryIsoLetter  =     project.proj_owner_country       ;
            this.Phone             =     project.proj_owner_phone         ;
            this.Email             =     project.proj_owner_email         ;
            this.Fax               =     project.proj_owner_fax           ;
            this.Location          =     project.proj_owner_location      ;
            this.Province          =     project.proj_owner_province      ;
            this.Remark            =     project.proj_remark              ;
        }

        public void UpdateToModel(T_PROJECT project)
        {              
            project.proj_owner              =   this.CompanyName          ;
            project.proj_owner_contact      =   this.ContactPerson        ;
            project.proj_owner_country      =   this.CountryIsoLetter     ;
            project.proj_owner_phone        =   this.Phone                ;
            project.proj_owner_email        =   this.Email                ;
            project.proj_owner_fax          =   this.Fax                  ;
            project.proj_owner_location     =   this.Location             ;
            project.proj_owner_province     =   this.Province             ;
            project.proj_remark             =   this.Remark               ;
        }
    }
This is very close to what AutoMapper is for. Though it doesn't directly support bidirectional maps, so you'll have to write a simple class that builds two mappers at the same time:

public class TwoWayMapper&lt;TSource, TDestination&gt;
{
    private readonly IMappingExpression&lt;TSource, TDestination&gt; m_sourceMapping =
        Mapper.CreateMap&lt;TSource, TDestination&gt;();
    private readonly IMappingExpression&lt;TDestination, TSource&gt; m_destinationMapping =
        Mapper.CreateMap&lt;TDestination, TSource&gt;();

    public TwoWayMapper&lt;TSource, TDestination&gt; ForMember(
        Expression&lt;Func&lt;TSource, object&gt;&gt; sourceMember,
        Expression&lt;Func&lt;TDestination, object&gt;&gt; destinationMember)
    {
        m_sourceMapping.ForMember(destinationMember, opt =&gt; opt.MapFrom(sourceMember));
        m_destinationMapping.ForMember(sourceMember, opt =&gt; opt.MapFrom(destinationMember));
        return this;
    }
}


You can then set up your mapping like this (maybe in a static constructor of ProjectOwnerDataFields?):

new TwoWayMapper&lt;ProjectOwnerDataFields, T_PROJECT&gt;()
    .ForMember(f =&gt; f.Id, p =&gt; p.proj_owner_id)
    .ForMember(f =&gt; f.CompanyName, p =&gt; p.proj_owner)
    .ForMember(f =&gt; f.ContactPerson, p =&gt; p.proj_owner_contact)
    .ForMember(f =&gt; f.CountryIsoLetter, p =&gt; p.proj_owner_country);
    // etc.


With that, your methods simplify to:

public ProjectOwnerDataFields(T_PROJECT project)
{
    Mapper.Map(project, this);
}

public void UpdateToModel(T_PROJECT project)
{
    Mapper.Map(this, project);
}