我正在尝试从联系人表中选择所有行并以WepApi方法返回它们,但数据无法正常返回。我可以看到集合中的所有行,但它们没有正确地反序列化。我明白为什么,但我不知道如何纠正它。
这是表结构。
以下是var contacts = db.Contacts.AsEnumerable();
但是json反序列化不正确导致第二个联系人为空。
第二个联系人嵌套在第一个联系人联系人类型中。这就是问题所在,但我不知道为什么会发生这种情况或如何纠正它。
我使用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; }
}
}
}