实体框架导航属性

时间:2014-03-03 12:24:20

标签: c# web-services entity-framework servicestack stack-overflow

我正在尝试使用EF从我的数据库中获取数据。我有一个表干预,其客户端与之关联,如下所示:

public partial class Client
{
    public Client()
    {
        this.Interventions = new List<Intervention>();
    }

    public int client_id { get; set; }
    public string full_name { get; set; }
    public string cgroup { get; set; }
    public string nation { get; set; }
    public virtual ICollection<Intervention> Interventions { get; set; }
}

public partial class Intervention
{
    public int intervention_id { get; set; }
    public int technician_id { get; set; }
    public int client_id { get; set; }
    public string type { get; set; }
    public int done { get; set; }
    public int year { get; set; }
    public int month { get; set; }
    public int week { get; set; }
    public Nullable<int> avg_response_time { get; set; }
    public int number_of_equip { get; set; }
    public virtual Client Client { get; set; }
    public virtual Technician Technician { get; set; }
}

我可以通过这样做获得一系列干预措施:

public object Any(GetInterventions request)
    {
        List<Intervention> dbItems;
        using (var context = new operationsContext())
        {
            context.Configuration.LazyLoadingEnabled = false;
            dbItems = context.Interventions.ToList();
            return new GetInterventionsResponse{
                interventions = dbItems
            };
        }
    }

虽然,当我尝试检索与每个干预相关联的客户端时

dbItems = context.Interventions.Include("Client").ToList();

通过包含客户端导航属性,我得到一个Visual Studio的stackOverflowException。 我使用EF做错了什么,或者只是一般的糟糕编程问题?

提前致谢

1 个答案:

答案 0 :(得分:2)

通过在我想要在JSON响应上序列化的类和字段引入[DataContract]和[DataMember]的装饰来解决问题。就像下面的例子一样:

using System.Runtime.Serialization;
namespace OperationsAPI.Models
{
    [DataContract]
    public partial class Intervention
    {
        public int intervention_id { get; set; }
        public int technician_id { get; set; }
        public int client_id { get; set; }
        public string type { get; set; }
        public int done { get; set; }
        public int year { get; set; }
        [DataMember]
        public int month { get; set; }
        [DataMember]
        public int week { get; set; }
        [DataMember]
        public Nullable<int> avg_response_time { get; set; }
        public int number_of_equip { get; set; }
        [DataMember]
        public virtual Client Client { get; set; }
        public virtual Technician Technician { get; set; }
    }
}