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

本文关键字:数据 保存 更好 方法 实体 框架 | 更新日期: 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()作为一个事务工作,如果在保存过程中的任何时候出现错误,它都会回滚。