C# 使用实体框架为多个表保存数据的更好方法
我目前正在使用以下方法将数据保存在数据库中的多个表中,这些表是从excel文件中提取的C# 使用实体框架为多个表保存数据的更好方法,c#,sql-server,database,entity-framework,C#,Sql Server,Database,Entity Framework,我目前正在使用以下方法将数据保存在数据库中的多个表中,这些表是从excel文件中提取的 public class Saver { public static int SaveCensusBatch(string key, ICollection<tbl_Life_Census> collection) { using (var db = new AuraEntities()) { var entry = new tbl
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;
}
}
}
公共类保存程序
{
公共静态int SaveCensusBatch(字符串键,ICollection集合)
{
使用(var db=new AuraEntities())
{
var entry=new tbl_Life_Master(){UUID=key,tbl_Life_Census=collection};
db.tbl_Life_Master.Add(条目);
db.SaveChanges();
返回1;
}
}
公共静态int SaveLifeData(字符串键2,ICollection集合)
{
使用(var db=new AuraEntities())
{
var entry=new tbl_Life_Master(){UUID=key2,tbl_Life_General_Info=collection};
db.tbl_Life_Master.Add(条目);
db.SaveChanges();
返回1;
}
}
公共静态T GetDBRecordByPK(字符串键),其中T:class
{
使用(var db=new AuraEntities())
{
var t=db.Set().Find(键);
返回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());
foreach(结果中的var r)
{
r、 UUID=key.ToString();
}
SaveCensusBatch(key.ToString(),results);
Saver.SaveLifeData(key.ToString(),results3);
var master=Saver.GetDBRecordByPK(key.ToString());
请建议我如何在一个“使用块”和一个函数下完成所有操作,而不是实现多个函数。这是因为我必须同时将数据插入20-30个表中。您可以将结果选择到列表中,然后将列表传递给函数。在这个save函数中,您可以为每个UUID执行循环,并在循环中包含前面三个函数的代码。然后在循环外的末尾调用db.SaveChanges()。db.saveChanges()作为一个事务工作,如果在保存过程中的任何时候出现错误,它都会回滚。您可以通过使所有Saver类的方法成为非静态的(它还可以防止在不需要数据时将数据保留在内存中),并使其实现IDisposable接口。之后,您只需遵循Microsoft建议的一次性模式(),例如:
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;
}
}
}
更新:最好从saver类之外保存。因为整个过程将作为一个单独的事务处理,如果引发异常,它将不会被持久化。您能为我做一个片段吗?因为我试着这么做,但是我在语法和其他方面遇到了一些问题。我不熟悉实体框架。如果可能的话,请提供帮助。您可以告诉我如何将所有结果放在一个列表中,因为它们已经在单独的列表中。非常不清楚。什么是
结果
,它从何而来?为什么要设置r.UUID
?什么是results3
,它来自哪里?首先,你为什么要上这个Saver
课程?为什么不在最后一段代码中直接保存所有内容?谢谢,我也这么做了
using(var saver = new Saver())
{
saver.SaveCensusBatch(key.ToString(), results);
saver.SaveLifeData(key.ToString(), results3);
saver.Save();
}