public static Object BindEDFieldValue(this Object instance, MemberInfo mi, AbstractBindMember bm, Object dbvalue)
        {
            FkMemberInfo fk = mi as FkMemberInfo;
            if (fk == null) return bm.bind(instance, mi, dbvalue);

            Object entity = bm.GetValue(instance, instance.GetType().GetMember(fk.ToBindInfo.Name)[0]);
            return bm.bind(entity, fk.PkInfo, dbvalue);
        }
        public static Object GetEDFieldValue(this Object instance, MemberInfo mi, AbstractBindMember bm)
        {
            FkMemberInfo fk = mi as FkMemberInfo;
            if (fk == null)
                return ValidDBValue(bm.GetValue(instance, mi));

            Object entity = bm.GetValue(instance, instance.GetType().GetMember(fk.ToBindInfo.Name)[0]);
            return bm.GetValue(entity, fk.PkInfo);
        }
        public FkMemberInfo(MemberInfo memberInfo, Type instanceFrom, AbstractBindMember bindMember)
        {
            ToBindInfo = memberInfo;
            InstanceType= bindMember.GetMemberType(memberInfo);

            if (InstanceType != null) MyInstance = Activator.CreateInstance(InstanceType, null);
            PkInfo = InstanceType.GetPkMemberInfo();

            if (PkInfo == null)
                throw new Exception("Every entity must have a Primary Key!");

            if (instanceFrom != InstanceType)
            {
                DBNameAttribute fieldNameAttribute = (DBNameAttribute)PkInfo.GetCustomAttribute(typeof(DBNameAttribute));
                PkName = (fieldNameAttribute != null)
                    ? fieldNameAttribute.Name
                    : PkInfo.Name;
            }
            else
                PkName = memberInfo.Name;
        }
 // Convert System.Type to SqlDbType
 public static SqlDbType GetSqlDbType(this MemberInfo mi, Object instance, AbstractBindMember bm)
 {
     return new SqlParameter("x", instance.GetEDFieldValue(mi, bm)).SqlDbType;
 }