应用程序显示"序列包含多个实体"错误.知道这通常是Linq中.SingleOrDefault()命令的结果,我开始调查.我可以验证生产服务器有多个重复关键字的实例,这就是我开始的地方.
我有以下关键字表:
如果需要打击我,活动只是一种"启用/禁用"数据的方法.我正在使用LINQ to SQL并实现以下方法:
public Keyword GetKeyword(String keywordText)
{
return db.Keywords.SingleOrDefault(k => (k.text.ToUpper() == keywordText.ToUpper()));
}
Run Code Online (Sandbox Code Playgroud)
我的想法是通过关联表附加关键字,以便多个对象可以引用相同的关键字.关键字表中不应有重复的文本条目.这不是在数据库上强制执行,而是通过代码强制执行.这可能不是最佳做法,但这是我目前遇到的最少问题.所以当我创建我的对象时,我这样做:
Keyword keyword = GetKeyword(keywordText)
if(keyword == null)
{
keyword = new Keyword();
keyword.text = keywordText;
keyword.active = Globals.ACTIVE;
db.Keywords.InsertOnSubmit(keyword);
}
KeywordReference reference = new KeywordReference();
reference.keywordId = keyword.id;
myObject.KeywordReferences.Add(reference);
db.SubmitChanges();
Run Code Online (Sandbox Code Playgroud)
这个代码实际上是释义的,我使用了一个存储库模式,所以所有相关的代码都会更长.但是,我可以向您保证代码正在按预期工作,因为我已对其进行了广泛测试.问题似乎发生在数据库级别.
所以我在我的测试数据库上运行了一些测试和手动查询,发现我在测试中传递的关键字不在数据库中,但是如果我做了JOIN,我看到它是.所以我深入挖掘并选择手动扫描整个列表:
SELECT * FROM Keyword
Run Code Online (Sandbox Code Playgroud)
返回737结果.我决定不想全部查看它们,所以我按文字排序并获得737结果.我寻找我最近添加的单词,它没有显示在列表中.
困惑,我查找与我最近工作的对象关联的所有keywordIds,并查看一些id超过1,000(id设置为自动增量1).知道我从来没有真正删除一个关键字(因此是"活动"列)所以从1到至少那些超过1,000的数字的所有ID都应该存在,我做另一个查询:
SELECT * FROM Keyword ORDER BY id
Run Code Online (Sandbox Code Playgroud)
返回737结果,最大ID停在737.所以我尝试:
SELECT * FROM Keyword ORDER BY id DESC
Run Code Online (Sandbox Code Playgroud)
返回1308行
如果没有主键或没有唯一标识符,我之前看到过这样的差异,但我确认id列实际上都是.我不确定从哪里开始,我现在还有另外一个问题,即生产中大约有4,000多个关键字是重复的,还有几个引用不同实例的对象.
给定ajax调用,例如:
$.ajax(
{
url:"MyWebService.blah",
data: {"data":"awesome"},
success : function(responseText)
{
var myJsonObj = $.parseJSON(responseText);
//do stuff with myJsonObj
}
});
Run Code Online (Sandbox Code Playgroud)
这工作正常.我今天将jQuery更新为1.9(我在1.6上暂时)作为Safari的一个可能的修复突然不支持各种切换功能(不再支持eventLayer.X),现在我所有的ajax调用都抛出了以下javascript错误:
Uncaught Syntax Error: Unexpected token o
Run Code Online (Sandbox Code Playgroud)
经过一些研究和一些测试后,我发现上面代码中的"responseText"现在是一个JSON对象,而不是一个字符串.所以这个错误是有道理的,但我试图绕过这个.jQuery真的改变了默认的返回类型吗?我检查了文档:
http://api.jquery.com/jQuery.ajax/
Run Code Online (Sandbox Code Playgroud)
和dataType默认为"智能猜测".我可以看到这可能是多么方便,但我也不喜欢它.
所以这是我的问题:
这是一个非常根本的变化,会影响很多代码.我将浏览我的代码并删除将我返回的数据解析为JSON的任何实例,但这一切都有点令人不安.我错误地指定了dataType?我认为强制执行dataType而不是依赖于默认值是一个好习惯,但是......哇.我是独自一人,或者说jQuery的变化有点冒昧?
考虑我正在运行的简化版本:
<html>
<head>
<script src="data.js"></script>
<script src="content.js"></script>
</head>
<body>
<div id="contentGoesHere"></div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
显然还有更多内容,但这是基本要点。在 content.js 中,我有几个函数可以根据 data.js 中包含的 json 数据将标记加载到我的 div 中。除了这些功能之外,还有以下几行:
$(document).ready(function()
{
loadContent();
});
Run Code Online (Sandbox Code Playgroud)
出于所有意图和目的,加载内容加载得很好,但在该代码中调用执行 jquery .show() 在几个 div 中的第一个 div,这些 div 在它们都附加到容器元素后加载。该代码没有执行,几乎就好像 div 还不存在一样。所以我尝试延迟加载:
<html>
<head>
<script src="data.js"></script>
</head>
<body>
<div id="contentGoesHere"></div>
</body>
<script src="content.js"></script>
</html>
Run Code Online (Sandbox Code Playgroud)
果然,两者都会导致显示第一个面板。如果 .ready() 应该等到 DOM 加载完毕,为什么延迟加载包含 $(document).ready() 函数的文件会有所不同?