我使用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;}”
所以它有效,但我仍有问题,我无法再从当地实体访问影院。 (不再双向)
答案 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; }
}