Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/88.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 奇怪的迁移到ef core 3后调用async Context.Set<;T>;().Add(t)创建9条相同的记录,而不是一条_C#_Jquery_Ajax_Entity Framework_.net Core - Fatal编程技术网

C# 奇怪的迁移到ef core 3后调用async Context.Set<;T>;().Add(t)创建9条相同的记录,而不是一条

C# 奇怪的迁移到ef core 3后调用async Context.Set<;T>;().Add(t)创建9条相同的记录,而不是一条,c#,jquery,ajax,entity-framework,.net-core,C#,Jquery,Ajax,Entity Framework,.net Core,我刚刚从NetCore2.2迁移到MVCNetCore3.0。现在,每当我尝试向数据库添加新记录时,应用程序都会在DB中创建同一记录的9个副本。我的数据库中有很多表,每一个表都会发生这种情况。当我使用NetCore2.2时,一切都很好 我正在使用此代码向DB添加新记录: 数据库上下文文件: public virtual async Task<T> AddAsync(T t) { Context.Set<T>().Add(t); await Context.

我刚刚从NetCore2.2迁移到MVCNetCore3.0。现在,每当我尝试向数据库添加新记录时,应用程序都会在DB中创建同一记录的9个副本。我的数据库中有很多表,每一个表都会发生这种情况。当我使用NetCore2.2时,一切都很好

我正在使用此代码向DB添加新记录:

数据库上下文文件:

public virtual async Task<T> AddAsync(T t)
{
    Context.Set<T>().Add(t);
    await Context.SaveChangesAsync();
    return t;
}
我可以在屏幕上看到9次“启动”警报。一段时间后,我可以看到“成功”警报9次


当我试图在Debugger中跟踪代码时,我可以看到从一个函数到另一个函数的执行是无序的——一个函数中的一行代码执行了好几次,然后在另一个函数中执行了好几次。在此之后,它返回到第一个函数的另一行,所有操作都重复5-10次


最奇怪的是,这9条记录通常都保存在MS server Db中。他们有所有的字段和键。但当我在屏幕上打开任何一个字段时,都会显示所有字段都是空的。但是,使用相同的应用程序,我仍然可以正常打开并在屏幕上看到在我移动到Core 3.0之前保存的记录。在您给出的代码中,我看不出为什么它会多次保存记录


我可以看到从一个函数到另一个函数的执行是无序的

如果有多个线程在运行,这是正常的。调试时,Visual Studio的工具栏中有一个“线程”下拉列表。当您看到它“跳转”到代码的另一部分时,请注意,在该下拉列表中选择的线程编号是不同的

但这可能表明正在处理多个请求(即,您实际发送了9个请求)。您应该能够在客户端(无论客户端是什么)上验证,或者可以删除所有断点,并在控制器操作中仅设置一个断点:

public async Task<IActionResult> AddCompany(Company item)
{
    //set breakpoint here
    var newcompany = await _companiesRepository.AddCompany(item);
}
这带来了另一种简化(和较小的性能增强):如果要在方法中只返回
await
的结果,可以取消该方法中的
async
await
,并解决问题

@GabrielLuci非常感谢你的帮助和一个好的提示

我发现每个“添加公司”按钮都会触发发送几个ajax请求的触发器。使用$(this).off('click')和类似工具根本不起作用

解决方案:

$(document).on("click", "#addCompany",
    function (e) {
        e.preventDefault();
         e.stopPropagation();
      ......
});

replaced by

$(document).on("click", "#addCompany",
    function (e) {
        e.preventDefault();
        e.stopImmediatePropagation();
       
});

现在一切都很好。“stopImmediatePropagation()”抑制了所有重复事件的“单击”触发器。

不完整。这9份副本的Id是否相同?是否有保存更改的覆盖?你怎么称呼这个方法?当您在此处设置断点时,它多久被命中一次?等等,“从一个函数到另一个函数的执行是无序的”意味着您在多个线程(请求)上运行。因此,请告诉我们如何/何时调用AddCompany()。它长期运行良好。但突然之间,事情变得很奇怪。它调用控制器中的每行代码5-6次。之后,移动到存储库,每行代码调用5-6次。然后返回控制器,所有操作再次重复。如果您看到它命中
Task AddCompany
5-6次,则表示收到了5-6个请求。这不是你的C代码中的错误。这是一个错误,但是这被称为(JavaScript?)谢谢你加布里埃尔。你是对的。在我单击任意按钮(获取或保存)后,jquery ajax sents异步请求9次。在此之后,我收到了9个成功的结果。这对我来说似乎是不可能的,我甚至不想浪费时间检查ajax请求。现在我看到这是可能的。但我仍然无法想象什么能迫使ajax发送9个请求而不是一个。有什么建议吗?我检查了chrome中的“元素”,它只显示了我的一个自定义js文件。如果没有看到JavaScript代码,我就说不出。您可以将其添加到问题中。如果有效,则意味着您的事件处理程序将被绑定9次(该
$(文档)。在(“click”、“#addCompany”、…)
行将被运行9次)。您可以在JavaScript中的该行上放置一个断点,查看它是否被多次命中,并找出原因。
public async Task<IActionResult> AddCompany(Company item)
{
    var newcompany = await _companiesRepository.AddCompany(item);
}
$(document).on("click", "#addCompany",
    function (e) {
        e.preventDefault();
        e.stopPropagation();
        var route="...";
        var formId="...";
     var form = $(formId);
        form.validate();
        if (!form.valid()) return;
        addCompany(route,formId);
});

function addCompany(route, formId) {
  
alert("start");

    var form = $(formId);
        var formData = form.serialize();
        
        $.ajax({
            async: true,
            url: route,
            type: "POST",
            cache: false,
            data: formData,
          
            success: function (result) {
                alert("sucess");
               

            },
            error: function (xhr) {
                alert("error");
               
            }
        });
};
public async Task<IActionResult> AddCompany(Company item)
{
    //set breakpoint here
    var newcompany = await _companiesRepository.AddCompany(item);
}
public async Task<Company> AddCompany(Company item)
{
    var savedItem = await base.AddAsync(item);

    var exist = Context.Companies.Find(savedItem.Id);
    if (exist == null) return exist;

    return savedItem;
}
public Task<Company> AddCompany(Company item)
{
    return base.AddAsync(item);
}
$(document).on("click", "#addCompany",
    function (e) {
        e.preventDefault();
         e.stopPropagation();
      ......
});

replaced by

$(document).on("click", "#addCompany",
    function (e) {
        e.preventDefault();
        e.stopImmediatePropagation();
       
});