我目前正在使用以下方法将数据保存在数据库中的多个表中,我从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;
}
}
}
以下是在main中调用它的代码:
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());
请建议我如何使用块&#39;和一个功能,而不是实现几个功能。这是因为我必须同时将数据插入20-30个表中。
答案 0 :(得分:0)
您可以将结果选择到List中并将列表传递给该函数。在该保存功能中,您可以为每个UUID执行循环,并为循环中的前三个函数提供代码。然后在循环外的末尾调用db.SaveChanges()。 db.saveChanges()作为事务工作,如果在保存期间的任何时候出现错误,则会回滚。
答案 1 :(得分:0)
您可以通过使所有Saver类的方法非静态(它还可以防止在您不需要时将数据保存在内存中)来实现,并使其实现IDisposable接口。之后,您只需要遵循Microsoft建议的一次性模式(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();
}
更新:如果您从保护程序类外部保存,则会更好。因为整个过程将表现为单个事务,并且如果引发异常则不会持久化。