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

本文关键字:保存更改 对象 一次 实体 框架 我们 | 更新日期: 2023-09-27 18:04:33

我正在使用Visual Studio 2012Entity 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();

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

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

添加一个新项并更新修改后的项并不像只调用一个方法那样简单。您需要区分何时添加新项目或何时更新。但是可以,您可以提交多个项目以进行更新或添加为新项目。例如,这种方法可以帮助您添加和更新实体:

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;
}

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

您可以尝试如下所示。

.附加

如果您有一个实体,它已经存在于数据库中,并且您已手动构建实体,请使用.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();

如果您想将所有行添加为新行:

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();

谢谢你的回答,你们和我都做了这样的事情只需创建表的对象,我指的是类:

EntityFrameworkEntities db = new EntityFrameworkEntities();
Classname obj = new Classname();
obj.updatefirstvalue = something;
obj.updatesecondvalue = something;
db.Entry(obj).State = EntityState.Modified;
db.SaveChanges();

就是这样。我们还可以添加更多我们想用savechanges更新的类,比如:

 foreach(var item in collection){
    Classname obj = new Classname();
    obj1.updatefirstvalue = item.something;
    obj1.updatesecondvalue = item.something;
    db.Entry(obj).State = EntityState.Modified;
    }
 db.SaveChanges();