【问题标题】:Better approach for saving data for multiple tables using entity framework使用实体框架为多个表保存数据的更好方法
【发布时间】:2015-11-02 20:27:53
【问题描述】:

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

请建议我如何在一个“使用块”和一个功能下完成所有操作,而不是实现多个功能。这是因为我必须同时向 20-30 个表中插入数据。

【问题讨论】:

  • 非常不清楚。什么是results,它从何而来?为什么设置r.UUID?什么是results3,它来自哪里?为什么你首先有这个Saver 类?为什么不直接在最后的代码sn-p中保存一切呢?
  • 谢谢我也这样做了

标签: c# sql-server database entity-framework


【解决方案1】:

您可以通过将 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();
}

更新:最好从保护类之外保存。因为他整个过程会表现为一个单一的事务,如果引发异常,它不会被持久化。

【讨论】:

    【解决方案2】:

    您可以将结果选择到列表中并将列表传递给函数。在该保存函数中,您可以为每个 UUID 执行循环,并在循环中包含前三个函数的代码。然后在循环外的末尾调用 db.SaveChanges() 。 db.saveChanges() 作为一个事务工作,如果在保存过程中的任何时候出现错误,它将回滚。

    【讨论】:

    • 你能帮我做一个sn-p吗?因为我正在尝试这样做,但是我在语法和所有方面都遇到了一些问题。我是实体框架的新手。如果可能,请提供帮助
    • 你能告诉我如何将所有结果放在一个列表中,因为它们已经在单独的列表中
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    相关资源
    最近更新 更多