【发布时间】:2021-01-25 09:35:37
【问题描述】:
我目前构建了一个 Visual Studio C# 项目,它通过实体框架将 API 数据保存到数据库中。每次我运行项目时,数据库中的表都会被擦除,然后再次重新添加数据。这是为了停止重复。但是,我想知道是否有替代路线我不必擦除数据但我可以添加不存在的新数据?
这是我项目中的代码。从我的主类中使用 RestSharp 获取 API 数据的方法开始,反序列化为 JSON 格式,然后保存到我的数据库。
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.RemoveRange(db.RequestDetails); //Wipes Data
db.RequestDetails.AddRange(result.Operation.Details); //Adds Data
db.SaveChanges();
} //Utilising EF to save data to the DB
}
} //Method that calls and stores API data
这是下面的实体框架类,你可以看到它只支持一个表(数据集)。
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);
}
}
这里是 DTO 类,它临时保存数据,用于构建适合 API 数据的类。
public class AllRequests
{
public class Rootobject
{
public Operation Operation { get; set; }
}
public class Operation
{
public Result Result { get; set; }
public Detail[] Details { get; set; }
}
public class Result
{
public string Message { get; set; }
public string Status { get; set; }
}
public class Detail
{
[Key]
public int Id { get; set; }
public string Requester { get; set; }
public string WorkOrderId { get; set; }
public string AccountName { get; set; }
public string CreatedBy { get; set; }
public string Subject { get; set; }
public string Technician { get; set; }
public string IsOverDue { get; set; }
public long DueByTime { get; set; }
public string Priority { get; set; }
public long CreatedTime { get; set; }
public string IgnoreRequest { get; set; }
public string Status { get; set; }
}
}
为了让 Entity Framework 正常工作,我必须创建一个 ID。此 ID 不包含任何 API 数据,它只是从 1 开始到有多少行。但是,WorkOrderId 是每一行的唯一 ID。我怎样才能让这个项目扫描表中的 WorkOrderId,并且只在没有 WorkOrderId 的地方添加新数据?
因为理想情况下,我希望每 5-10 分钟运行一次这个项目,以保持表格不断更新,但是,目前我觉得擦桌子并不是理想的方式,而且是一个漫长的过程。如果我可以实现这个过程,我会更喜欢它。任何帮助或指示将不胜感激。
【问题讨论】:
-
那么应该如何处理已插入数据库但在新记录批次中不存在的记录?
-
在这种情况下永远不会发生这种情况,无论如何,所有被拉取的记录都将保留在那里。
标签: c# sql-server entity-framework restsharp dto