我一直在抨击这个问题很长一段时间,我真的很感激一些帮助。
我正在使用ASP.NET编写一个网站。业务层分为两部分:BL-Server和BL-Client。 BL-Server实际上是一个WCF服务,用于屏蔽数据访问层和数据库。 WCF服务连接到DAL,DAL又从DB读取。我们正在使用MSSQL。
在对DB的其中一个表进行微小更改后开始出现问题(将bool列添加到表“Responses”)。
突然间,每当我通过WCF服务请求信息时,我都会遇到以下异常: “System.ServiceModel.CommunicationException未被用户代码处理 消息=基础连接已关闭:连接意外关闭。“
这有点奇怪,因为即使我从不同的表(例如“部门”)请求数据时也会发生错误。
我已经做了一些挖掘,在设置跟踪到WCF服务(参见:http://forums.asp.net/t/1476129.aspx/1)之后,我发现WCF服务中导致它突然关闭连接的问题是缓冲区溢出。尝试将对象加载到返回缓冲区时,该服务会引发以下异常: “编写具有递归结构的对象在深度较大时具有局限性。考虑减小对象的深度。”
这导致我在DAL方法中设置一个断点,该方法加载“Departments”数据并检查即将通过WCF服务发送的对象。
原来对象中有一些循环。你可以在无限循环中浏览它的元素,因为“Departments”有一些儿童元素可以指向他。
这对我来说很奇怪,所以我检查了.dbml文件,一个walla - “Departments”有一个指向它的实体列表。我发现,这可以在链接(两个实体之间,.dbml文件中)属性中启用/禁用。该属性称为“子属性”,在启用时,广告一个对象列表,该对象具有对该元素的外键。 (例如:如果A的FK为B.B元素将具有以下成员:private EntitySet<A> _A;
)
此时可能会认为解决方案是将实体之间所有链接的所有“子属性”设置为false。但最终会出现其他例外情况,例如: “System.Data.Linq.ForeignKeyReferenceAlreadyHasValueException未被用户代码处理 Message =由于对象的当前状态,操作无效。“(由实体抛出)。
此外,我不想弄乱.dbml文件。我知道在MINOR更改为“Responses”表之前一切正常,我发现很难相信一个表中的微小变化会导致实体代码中的这么多混乱。
我很抱歉这篇长篇文章,但这个问题让我发疯,我想确保我提供所有相关信息。
注意:应用程序的结构是先决条件,我无法更改它,所以我们不要再讨论它了。
提前致谢, SummerBulb
更新:
由于我正在使用源代码控制,我能够比较旧的“BusinessElements.designer.cs”和新的。我发现旧文件包含许多处理序列化的代码。例如:[global::System.Runtime.Serialization.DataMemberAttribute(Order=1)]
,添加到所有属性(getter和setter)的属性。
是否因为新的布尔值而移除了此代码?如何取回序列化支持代码?
答案 0 :(得分:0)
解决!
原来“序列化模式”属性设置为“无”。 我把它设置为“单向”,现在一切都很好。
如果您遇到同样的问题并发现这有用,请留言告诉我。
谢谢!
答案 1 :(得分:0)
查看this article它可能有助于您了解添加(或删除)特定属性的原因/时间
要检查的另一件事是您是否仍在使用相同版本的Entity框架。