C# 使用实体框架为多个表保存数据的更好方法

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

我目前正在使用以下方法将数据保存在数据库中的多个表中,这些表是从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;
       }
   }  

}
公共类保存程序
{
公共静态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();
}