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

时间:2015-11-02 20:27:54

标签: 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_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个表中。

2 个答案:

答案 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();
}

更新:如果您从保护程序类外部保存,则会更好。因为整个过程将表现为单个事务,并且如果引发异常则不会持久化。