获取外键不能正确返回数据

时间:2014-08-18 16:57:41

标签: c# json entity-framework asp.net-web-api

我正在尝试从联系人表中选择所有行并以WepApi方法返回它们,但数据无法正常返回。我可以看到集合中的所有行,但它们没有正确地反序列化。我明白为什么,但我不知道如何纠正它。

这是表结构。

enter image description here

以下是var contacts = db.Contacts.AsEnumerable();

的结果

enter image description here

但是json反序列化不正确导致第二个联系人为空。 enter image description here

第二个联系人嵌套在第一个联系人联系人类型中。这就是问题所在,但我不知道为什么会发生这种情况或如何纠正它。

enter image description here

我使用JsonNetSerialization进行转换

编辑发布Json代码部分:

public class JsonNetSerialization : ISerialization
{
    public string Serialize<T>(object o)
    {
        return JsonConvert.SerializeObject((T)o);
    }

    public object DeSerialize<T>(Stream stream)
    {
        return JsonConvert.DeserializeObject<T>(new StreamReader(stream).ReadToEnd());
    }
}


public class BaseRepository
{
    protected ISerialization _serializer;
    protected object deSerialize<T>(Stream stream)
    {
        var retval = _serializer.DeSerialize<T>(stream);
        return retval;
    }

    protected string serialize<T>(T value)
    {
        var retval = _serializer.Serialize<T>(value);
        return retval;
    }
}

public StructureMapRegistry()
{
    For<ISerialization>().Use<JsonNetSerialization>();
}

EF生成的联系实体:

namespace ExtranetDb
{
    [EdmEntityTypeAttribute(NamespaceName="ExtraNetModel", Name="Contact")]
    [Serializable()]
    [DataContractAttribute(IsReference=true)]
    public partial class Contact : EntityObject
    {
        [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
        [DataMemberAttribute()]
        public global::System.Int32 ContactID
        { }

        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
        [DataMemberAttribute()]
        public global::System.Int32 ContactTypeID
        { }

        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
        [DataMemberAttribute()]
        public global::System.String FirstName
        { }

        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
        [DataMemberAttribute()]
        public global::System.String LastName
        { }

        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
        [DataMemberAttribute()]
        public global::System.String MiddleName
        { }

        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
        [DataMemberAttribute()]
        public global::System.String NameSuffix
        { }

        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
        [DataMemberAttribute()]
        public global::System.String Address1
        { }

        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
        [DataMemberAttribute()]
        public global::System.String Address2
        { }

        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
        [DataMemberAttribute()]
        public global::System.String City
        { }

        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
        [DataMemberAttribute()]
        public global::System.String StateAbbrv
        { }

        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
        [DataMemberAttribute()]
        public global::System.String PostalCode
        { }

        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
        [DataMemberAttribute()]
        public global::System.String HomePhoneNumber
        { }

        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
        [DataMemberAttribute()]
        public global::System.String WorkPhoneNumber
        { }

        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
        [DataMemberAttribute()]
        public global::System.String MobilePhoneNumber
        { }

        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
        [DataMemberAttribute()]
        public global::System.String FaxPhoneNumber
        { }

        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
        [DataMemberAttribute()]
        public global::System.String OtherPhoneNumber
        { }

        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
        [DataMemberAttribute()]
        public global::System.String PostalCodeSuffix
        { }

        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
        [DataMemberAttribute()]
        public Nullable<global::System.DateTime> BirthDate
        { }

        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
        [DataMemberAttribute()]
        public global::System.String Email
        { }

        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
        [DataMemberAttribute()]
        public Nullable<global::System.Int16> SuppressLetters
        { }

        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
        [DataMemberAttribute()]
        public Nullable<global::System.Int32> LanguageID
        { }

        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
        [DataMemberAttribute()]
        public global::System.DateTime DateCreated
        { }

        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
        [DataMemberAttribute()]
        public global::System.DateTime DateUpdated
        { }

        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
        [DataMemberAttribute()]
        public Nullable<global::System.Int32> PID
        { }

        [XmlIgnoreAttribute()]
        [SoapIgnoreAttribute()]
        [DataMemberAttribute()]
        [EdmRelationshipNavigationPropertyAttribute("ExtraNetModel", "FK_Contact_ContactType", "ContactType")]
        public ContactType ContactType
        { }

        [BrowsableAttribute(false)]
        [DataMemberAttribute()]
        public EntityReference<ContactType> ContactTypeReference
        { }

        [XmlIgnoreAttribute()]
        [SoapIgnoreAttribute()]
        [DataMemberAttribute()]
        [EdmRelationshipNavigationPropertyAttribute("ExtraNetModel", "FK_Contact_SpokenLanguage", "SpokenLanguage")]
        public SpokenLanguage SpokenLanguage
        { }

        [BrowsableAttribute(false)]
        [DataMemberAttribute()]
        public EntityReference<SpokenLanguage> SpokenLanguageReference
        { }
    }
}

客户端联系实体:

namespace ProspectingPlatformWeb.Models
{
    public class Contact
    {
        [DisplayName("ID")]
        public int ContactID { get; set; }

        [DisplayName("Contact Type")]
        public Int32 ContactTypeID { get; set; }

        [DisplayName("First Name")]
        [Required(ErrorMessage = "Please Enter a First Name")]
        [MaxLength(50, ErrorMessage = "Limit 50 Characters")]
        public String FirstName { get; set; }

        [DisplayName("Last Name")]
        [Required(ErrorMessage = "Please Enter a Last Name")]
        [MaxLength(50, ErrorMessage = "Limit 50 Characters")]
        public String LastName { get; set; }

        [DisplayName("Middle Name")]
        public String MiddleName { get; set; }

        [DisplayName("Name Suffix")]
        public String NameSuffix { get; set; }

        [Required(ErrorMessage = "Please Enter a Address")]
        [MaxLength(60, ErrorMessage = "Limit 60 Characters")]
        [DisplayName("Address 1")]
        public String Address1 { get; set; }

        [DisplayName("Address 2")]
        public String Address2 { get; set; }

        [Required(ErrorMessage = "Please Enter a City")]
        [MaxLength(50, ErrorMessage = "Limit 50 Characters")]
        [DisplayName("City")]
        public String City { get; set; }

        [Required(ErrorMessage = "Please Enter a State")]
        [MaxLength(2, ErrorMessage = "Limit 2 Characters")]
        [DisplayName("State")]
        public String StateAbbrv { get; set; }

        [Required(ErrorMessage = "Please Enter a Postal Code")]
        [MaxLength(10, ErrorMessage = "Limit 10 Numbers")]
        [DisplayName("Postal Code")]
        public String PostalCode { get; set; }

        [MaxLength(15, ErrorMessage = "Limit 15 Characters")]
        [DisplayName("Home Phone")]
        public String HomePhoneNumber { get; set; }

        [MaxLength(15, ErrorMessage = "Limit 15 Characters")]
        [DisplayName("Work Phone")]
        public String WorkPhoneNumber { get; set; }

        [MaxLength(15, ErrorMessage = "Limit 15 Characters")]
        [DisplayName("Mobile Phone")]
        public String MobilePhoneNumber { get; set; }

        [MaxLength(15, ErrorMessage = "Limit 15 Characters")]
        [DisplayName("Fax Number")]
        public String FaxPhoneNumber { get; set; }

        [MaxLength(15, ErrorMessage = "Limit 15 Characters")]
        [DisplayName("Other Phone")]
        public String OtherPhoneNumber { get; set; }

        [MaxLength(4, ErrorMessage = "Limit 4 Numbers")]
        [DisplayName("Postal Code Suffix")]
        public String PostalCodeSuffix { get; set; }

        [DisplayName("Birth Date")]
        [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]
        public DateTime? BirthDate { get; set; }

        [DisplayName("Email Address")]
        public String Email { get; set; }

        [DisplayName("Suppress Letters")]
        public short? SuppressLetters { get; set; }

        [DisplayName("Language")]
        public int? LanguageID { get; set; }

        private DateTime dateCreated;

        private DateTime dateUpdated;

        [HiddenInput(DisplayValue = true)]
        public int? PID { get; set; }

        public IEnumerable<ContactType> ContactTypes { get; set; }
        public IEnumerable<SpokenLanguage> Languages { get; set; }
        public IEnumerable<LoanOfficer> LoanOfficers { get; set; }

        [HiddenInput(DisplayValue = false)]
        public DateTime DateCreated
        {
            get { return string.IsNullOrEmpty(dateCreated.ToString()) ? DateTime.Now : dateCreated; }
            set { dateCreated = value; }
        }

        [HiddenInput(DisplayValue = false)]
        public DateTime DateUpdated
        {
            get { return string.IsNullOrEmpty(dateUpdated.ToString()) ? DateTime.Now : dateUpdated; }
            set { dateUpdated = value; }
        }
    }
}

0 个答案:

没有答案