我们可以在实体框架中附加多个对象并进行一次保存更改

时间:2016-08-29 07:13:37

标签: c# entity-framework entity-framework-6 updates

我正在使用 Visual Studio 2012 Entity Framework 6.0 ,我正在进行一些CRUD操作,但我现在面临一些挑战。

我在一个表单中做了多个条目,想要一次更新或保存这些细节,所以我现在这样做:

创建对象和商店值,然后逐个附加添加/更新并保存更改。

但是我可以像附加多个类的对象那样做,最后做savechanges我的意思是for循环。那么通过附加多个对象来运行以保存多个savechanges吗?

示例:

for(int i=0; i < comingrequestdata.Count(); i++)
{
    ObjectExample obj = new ObjectExampole();

    obj.Value1 = comingrequestdata[i].Value1;
    obj.Value2 = comingrequestdata[i].Value2;
    obj.Value3 = comingrequestdata[i].Value3;

    context.ObjectExamples.Attach(obj);
}

context.SaveChanges();

我可以这样做吗?我有点困惑,请有人帮助我。

4 个答案:

答案 0 :(得分:2)

添加新项目并更新修改后的项目并不简单,只需调用一个方法即可。您需要区分添加新项目的时间或更新时间。但是,您可以提交多个要更新的项目或添加为新项目。例如,此方法可以帮助您同时添加和更新实体:

public SomeEntity AddOrUpdate(SomeEntity item)
{
    var original = _context.SomeDbSet.Local.FirstOrDefault(p => p.Id == item.Id) 
                   ?? _context.SomeDbSet.FirstOrDefault(p => p.Id == item.Id);

    if (original != null) // Updating
    {
        var entry = _context.Entry(original);
        entry.CurrentValues.SetValues(item);
    }
    else
    {
         // New item
         item = _context.SomeDbSet.Add(item);
    }

    return item;
}

在对此方法进行多次调用后,请在基于SaveChanges的对象上调用DbContext

答案 1 :(得分:0)

您可以尝试如下所示。

<强> .Attach

  

如果你有一个已存在于数据库中的实体,那么你   已手动构建实体,使用.Attach

<强> .AddObject

  

如果您有一个全新的对象,请使用.AddObject

for(int i=0; i < comingrequestdata.Count(); i++)
{
    ObjectExample obj = new ObjectExampole();

    obj.Value1 = comingrequestdata[i].Value1;
    obj.Value2 = comingrequestdata[i].Value2;
    obj.Value3 = comingrequestdata[i].Value3;

    context.ObjectExamples.AddObject(obj);
}

context.SaveChanges();

答案 2 :(得分:0)

如果您要将所有行添加为新行,请执行以下操作:

for(int i=0; i < comingrequestdata.Count(); i++)
{
    //ObjectExample obj = new ObjectExampole();
    context.ObjectExamples.Add( new ObjectExample {
        Value1 = comingrequestdata[i].Value1,
        Value2 = comingrequestdata[i].Value2,
        Value3 = comingrequestdata[i].Value3
    }

}
context.SaveChanges();

如果你想修改数据库中的现有值(你需要一个主键来识别一条记录,以便从数据库中获取它,修改它,然后保存回来):

如果其中任何一个可以唯一地标识记录,您可以使用Value1 / Value2 / Value3中的一个。

for(int i=0; i < comingrequestdata.Count(); i++)
{
    ObjectExample obj = context.ObjectExamples.Where(o => o.ID == Value4); // this is the unique id, assuming it is called ID in the database and Value4 stores its value in your code

    obj.Value1 = comingrequestdata[i].Value1;
    obj.Value2 = comingrequestdata[i].Value2;
    obj.Value3 = comingrequestdata[i].Value3;
    context.ObjectExamples.Attach(obj);
    context.Entry(obj).State = EntityState.Modified;
}
context.SaveChanges();

答案 3 :(得分:0)

感谢大家的回答,我已经做过像这样的事情了 只需创建表的对象,我的意思是类:

        private void button2_Click(object sender, EventArgs e)
    {

        string output = JsonConvert.SerializeObject(this.dataGridView1);
        System.IO.File.WriteAllText("json.json", output);
    }

那就是它。我们还可以添加更多类我们想要使用savechanges更新的类,如:

EntityFrameworkEntities db = new EntityFrameworkEntities();

Classname obj = new Classname();
obj.updatefirstvalue = something;
obj.updatesecondvalue = something;

db.Entry(obj).State = EntityState.Modified;
db.SaveChanges();