我有一个关于使用Liqn to SQL使用DB的问题。
我有一个小数据库,其中包含4个表,我有为此表创建的Liq to SQL类:
所以,它都是在我的AppName上创建的。 Web 项目。我还创建了一个WPF服务,它返回包含所有条目的List集合。
当我试图从Silverlight项目调用我的函数时,我有 CommunicationException 。我试图设置maxReceivedMessageSize
和maxBufferSize
,但问题仍然存在。我将[DataContract]
和[DataMember]
标记添加到自动生成的类(属性除外,代表引用,例如Items
表中的Mod
,Recipes
和{{ 1}}在Entries
表中,等等,它开始工作,但我只能从一个表中接收数据。
如何在所有表中收到包含所有子项的Mod列表? linq to sql是最好和最简单的方法之一吗?
UPD1: 返回列表的函数:
Item
答案 0 :(得分:0)
CommunicationException非常广泛。您可以在WCF服务上创建一个简单的操作,以确保它可以访问,并且您没有配置/托管问题吗?
或者打开WCF消息记录并使用svctraceviewer更好地了解CommunicationException(http://msdn.microsoft.com/en-us/library/ms730064(v=vs.110).aspx)的根本原因
还要确保在从WCF服务返回之前,您已经实现了Linq2Sql查询的结果。
对于对象关系映射器(ORM)的选择,不推荐使用Linq2Sql,而选择EntityFramework。它仍然有效,但很像人类的附录,它是一个进化的死胡同。
在查看堆栈跟踪之后,我已经能够确定WCF无法序列化相关类型,因为Linq2Sql将它们作为动态代理发出,而不是作为已标记为数据协定的类型。我建议手动或使用像Automapper这样的效果进行映射,然后再从服务返回
Select(i => new Mod()
{
Items = i.Items.Select((j) => new Item() { Foo = j.Foo } }
});
等
还有一点需要注意:EntityFramework允许选项关闭动态代理,但我不知道Linq2Sql是否支持。 (作为两者之间的比较点)