使用实体框架为多个表保存数据的更好方法
本文关键字:数据 保存 更好 方法 实体 框架 | 更新日期: 2023-09-27 18:20:12
我目前正在使用以下方法将数据保存在数据库中的多个表中,这些表是我从excel文件中提取的。
public class Saver
{
public static int SaveCensusBatch(string key, ICollection<tbl_Life_Census> collection)
{
using (var db = new AuraEntities())
{
var entry = new tbl_Life_Master() { UUID = key, tbl_Life_Census = collection };
db.tbl_Life_Master.Add(entry);
db.SaveChanges();
return 1;
}
}
public static int SaveLifeData(string key2, ICollection<tbl_Life_General_Info> collection)
{
using (var db = new AuraEntities())
{
var entry = new tbl_Life_Master() { UUID = key2, tbl_Life_General_Info = collection };
db.tbl_Life_Master.Add(entry);
db.SaveChanges();
return 1;
}
}
public static T GetDBRecordByPK<T>(string key) where T : class
{
using (var db = new AuraEntities())
{
var t = db.Set<T>().Find(key);
return t;
}
}
}
以下是主要调用此操作的代码:
foreach (var r in results)
{
r.UUID = key.ToString();
}
Saver.SaveCensusBatch(key.ToString(), results);
Saver.SaveLifeData(key.ToString(), results3);
var master = Saver.GetDBRecordByPK<tbl_Life_Master>(key.ToString());
请建议我如何在一个"使用块"和一个函数下完成所有操作,而不是实现几个函数。这是因为我必须同时将数据插入20-30个表中。
您可以通过使Saver类的所有方法都是非静态的(它还可以防止在不需要时将数据保留在内存中)来实现这一点,并使其实现IDisposable接口。之后,你只需要遵循微软建议的一次性模式(https://msdn.microsoft.com/en-us/library/b1yfkh5e%28v=vs.110%29.aspx),例如:
public class Saver : IDisposable
{
private readonly AuraEntities db;
private bool disposed;
public Saver()
{
db = new AuraEntities();
disposed = false;
}
public int SaveCensusBatch(string key, ICollection<tbl_Life_Census> collection)
{
var entry = new tbl_Life_Master() { UUID = key, tbl_Life_Census = collection };
db.tbl_Life_Master.Add(entry);
return 1;
}
public int SaveLifeData(string key2, ICollection<tbl_Life_General_Info> collection)
{
var entry = new tbl_Life_Master() { UUID = key2, tbl_Life_General_Info = collection };
db.tbl_Life_Master.Add(entry);
return 1;
}
public T GetDBRecordByPK<T>(string key) where T : class
{
var t = db.Set<T>().Find(key);
return t;
}
public void Save()
{
db.SaveChanges();
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (disposed)
{
return;
}
if (disposing && db != null)
{
db.Dispose();
disposed = true;
}
}
}
然后在如下的using语句中调用方法:
using(var saver = new Saver())
{
saver.SaveCensusBatch(key.ToString(), results);
saver.SaveLifeData(key.ToString(), results3);
saver.Save();
}
更新:最好是从saver类之外保存。因为整个过程将表现为单个事务,并且如果引发异常,它将不会持久化。
您可以将结果选择到List中,并将列表传递给函数。在这个保存函数中,您可以为每个UUID执行循环,并在循环中包含前面三个函数的代码。然后调用数据库。SaveChanges()位于循环外的末尾。db.saveChanges()作为一个事务工作,如果在保存过程中的任何时候出现错误,它都会回滚。