【发布时间】: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 将更新与您更新的数据相对应的行。考虑一个包含ID和Name列的表。它有三行,ID 和名称递增,分别为 Alice、Bob 和 Carol。如果您阅读了所有内容,请将 Bob 的名称更改为 Robert 并致电SaveChanges,表格应该会更新-Presto。 -
我的意思是你可以获取表格,删除行,然后添加新的......或者匹配某个索引并更新它们。
-
但这并不能阻止数据复制?每次我点击 SaveChanges 时,数据都会重复。而且我有点知道为什么,这是因为我为 API 制作的虚假 ID 只会在每个新行上递增。但为了这张桌子,我不得不这么做。但是,由于这里的答案之一,我找到了一种方法,通过删除数据并使用“db.RequestDetails.RemoveRange(db.RequestDetails)”在每个进程上添加新数据。即使不完全理想,该解决方案也确实有效。
标签: c# sql-server entity-framework restsharp