【问题标题】:How to wipe data in a table each time you save to a database每次保存到数据库时如何擦除表中的数据
【发布时间】:2021-01-21 22:57:18
【问题描述】:

我目前构建了一个 Visual Studio C# 项目,该项目通过实体框架将 API 数据保存到数据库中。一切正常,但我注意到每次运行应用程序时,表中的数据都会重复。

我必须不时重新启动它,因为有新数据需要存储,但我在想有没有一种简单的方法,甚至只是一种在每次将数据保存到数据库之前擦除表的方法运行应用程序?

这是我目前正在运行的代码。

public static void getAllRequestData()
{
    var client = new RestClient("[My API URL]");
    var request = new RestRequest();
    var response = client.Execute(request);

    if (response.StatusCode == System.Net.HttpStatusCode.OK)
    {
        string rawResponse = response.Content;
        AllRequests.Rootobject result = JsonConvert.DeserializeObject<AllRequests.Rootobject>(rawResponse);

        using (var db = new TransitionContext())
        {
            db.RequestDetails.AddRange(result.Operation.Details);
            db.SaveChanges();
        } //Utilising EF to save data to the DB
    }
} //Method that calls and stores API data

此方法用于获取 API 数据,对其进行反序列化,然后将其保存到 Db。

public class TransitionContext : DbContext
{
    private const string connectionString = @"[My Server]";

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer(connectionString);
    }

    public DbSet<AllRequests.Detail> RequestDetails { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<AllRequests.Detail>().HasKey(r => r.Id);
    }
}

这是我的实体框架 DbContext,用于搭建表格并将数据映射到每一列。

这一切都有效,但我必须在我的代码中包含什么才能在每次运行项目时停止重复数据?目前,每次运行项目时,我的表中都会有超过 1000 行,最终,它会被阻塞。我希望它每次运行时都是相同的数据,除了每周添加一些添加内容。

任何帮助将不胜感激,谢谢。

【问题讨论】:

  • 传统上,您将新数据插入到数据库中。如果有人做出更改,您更新现有数据。您的表是否有主键或任何 唯一 约束?
  • 是的,我的表有一个主键,我必须创建一个新的主键,因为我获取的 API 数据没有主键,所以我只是在我的项目中创建了一个主键。但问题是,我注意到每次运行项目时,它都会不断复制相同的数据(当然是在不同的 ID 上)。因此,如果我将项目运行 4 次,每个数据将有 4 行相同的行,但 ID 不同。
  • 所以,你有一个主键,它是一个标识列。由于您有 PK,因此您可以更新数据,当您在上下文中调用 SaveChanges 时,EF 将更新与您更新的数据相对应的行。考虑一个包含IDName 列的表。它有三行,ID 和名称递增,分别为 AliceBobCarol。如果您阅读了所有内容,请将 Bob 的名称更改为 Robert 并致电 SaveChanges,表格应该会更新-Presto。
  • 我的意思是你可以获取表格,删除行,然后添加新的......或者匹配某个索引并更新它们。
  • 但这并不能阻止数据复制?每次我点击 SaveChanges 时,数据都会重复。而且我有点知道为什么,这是因为我为 API 制作的虚假 ID 只会在每个新行上递增。但为了这张桌子,我不得不这么做。但是,由于这里的答案之一,我找到了一种方法,通过删除数据并使用“db.RequestDetails.RemoveRange(db.RequestDetails)”在每个进程上添加新数据。即使不完全理想,该解决方案也确实有效。

标签: c# sql-server entity-framework restsharp


【解决方案1】:

解决此问题将取决于 API 的工作方式。如果数据以在调用之间不改变的顺序返回,那么您可以记住数据库中保存的最后一个对象的索引,并且下次只保存具有更高索引的字段。但是,如果在调用之间没有保持顺序,那么您将不得不手动比较对象以检查重复项,这不是很省时,但总比没有好。问题是,如果返回的每个项目都不是唯一的,则第二个选项将无法可靠地工作。在这种情况下,唯一可行的方法是完全清除表并重新插入所有内容。您可以致电db.RequestDetails.RemoveRange(db.RequestDetails) 清空表格。无论如何,这甚至可能比比较方法更快。

【讨论】:

  • 谢谢,这行得通。 ID 不断增加,但我并不在意,只要数据被重置并且每次运行它时都不会重复相同的行。欣赏解决方案!
  • @KyleAT 我很高兴能帮上忙 :) 我只想补充一点,如果可能的话,您应该考虑从 api 保存最后一个索引的方法,因为它可能是最有效的。但是,如果您坚持清理表格,db.Database.ExecuteSqlRaw(sqlStringToClearTheTable) 可能比我之前建议的要好一些,但确切的参数将取决于您使用的 sql。
  • 再次感谢您,我会看看这个,效率越高越好,但我很高兴它有效。
  • 我已经尝试了 executeSqlRaw 解决方案,谢谢它更好。我更愿意做你提到的第一种方法,但我不知道该怎么做。每次运行解决方案时,我都会手动添加新数据。我希望它只添加新行而不是删除。但显然,如果我不删除,它们就会重复。
  • 顺便说一下,所有 API 调用都共享一个 ID,它们应该是相同的,以便记忆。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-26
  • 2011-12-19
  • 1970-01-01
  • 1970-01-01
  • 2013-02-12
  • 1970-01-01
  • 2021-09-30
相关资源
最近更新 更多