实体框架:获取相关实体

时间:2013-06-19 19:43:47

标签: frameworks entity entities

我使用Entity Framework创建了一个WCF服务。

我有两张桌子:剧院和地方。地方作为剧院的外键。

我的方法:

public theater[] GetTheaters()
{

    using (Entities context = new Entities())
    {
        return context.theater.ToArray();

    }
}

我必须在我的影院课程中从“public virtual locality locality {get; set;}”中删除“virtual”关键字。否则,我得到一个CommunicationException。

但是当我这样做时,我得到了我的剧院列表,但地点是空的......

我如何获得地点?

由于

我的模型类(我还有其他实体):

    public partial class locality
    {
        public locality()
        {
            this.theater = new HashSet<theater>();
        }

        public int idLocality { get; set; }
        public int npa { get; set; }
        public string locality1 { get; set; }

        public  ICollection<theater> theater { get; set; }
    }


    public partial class theater
    {
        public theater()
        {
            this.session = new HashSet<session>();
        }

        public int idTheater { get; set; }
        public string name { get; set; }
        public string address { get; set; }
        public int idLocality { get; set; }
        public double latitude { get; set; }
        public double longitude { get; set; }
        public int seats { get; set; }
        public string phone { get; set; }
        public string email { get; set; }
        public bool threeD { get; set; }

        public  locality locality { get; set; }
        public  ICollection<session> session { get; set; }
    }

这是我得到的错误:

“类型'位置'的对象图包含周期,如果禁用参考跟踪,则无法序列化。

编辑:

我找到的解决方案:

在我的地方课上,我有一系列剧院。

我不得不像这样添加“私人”:

“public ICollection theater {get; private set;}”

所以它有效,但我仍有问题,我无法再从当地实体访问影院。 (不再双向)

3 个答案:

答案 0 :(得分:0)

您可以使用eager loading or explicit loading。通过预先加载,您可以使用Include扩展方法:

return context.Theater.Include(t => t.Locality).ToArray();

答案 1 :(得分:0)

如果要强制加载相关实体,可以使用Include method执行此操作。默认情况下,Lazily会加载相关实体。

你的例子是:

public theater[] GetTheaters()
{

    using (Entities context = new Entities())
    {
        return context.theater.Include(t=>t.Locality).ToArray();

    }
}

答案 2 :(得分:0)

您缺少正确的注释来创建关系。请参阅下面的代码。 (或者如果使用FluentAPI则自己创建关系)

查找[Key][ForeignKey]注释以及virtual关键字。

public partial class locality
    {
        public locality()
        {
            //this.theater = new HashSet<theater>();
        }

        [Key]
        public int idLocality { get; set; }

        public int npa { get; set; }
        public string locality1 { get; set; }

        public virtual ICollection<theater> theaters { get; set; }
    }


    public partial class theater
    {
        public theater()
        {
            //this.session = new HashSet<session>();
        }

        [Key]
        public int idTheater { get; set; }

        public string name { get; set; }
        public string address { get; set; }
        public int idLocality { get; set; }
        public double latitude { get; set; }
        public double longitude { get; set; }
        public int seats { get; set; }
        public string phone { get; set; }
        public string email { get; set; }
        public bool threeD { get; set; }

        [ForeignKey("idLocality")]
        public virtual locality locality { get; set; }
        //public ICollection<session> session { get; set; }
    }