0

如标题所述,有多少种方法可用?

我只是有这种情况:我从一个 ObjectContext 中获取一个实体对象,然后将实体对象从 OjbectContext 对象中分离出来,然后返回它。

稍后,如果我对此对象进行了一些更改,并且我想将更改保存回数据库。我想我应该这样写,对吧?(嗯,这对我有用。)

public Url GetOneUrl()
{
    Url u;
    using(ServicesEntities ctx = new ServicesEntities())
    {
        u = (from t in ctx.Urls select t).FirstOrDefault<Url>();
        ctx.Detach(u);
    }
    return u;
}

public void SaveToDB(Url url)
{
   using(ServicesEntities ctx = new ServicesEntities())
   {
       var t = ctx.GetObjectByKey(_Url.EntityKey) as Url;
       ctx.Detach(t);
       ctx.Attach(url);
       ctx.ObjectStateManager.ChangeObjectState(url, System.Data.EntityState.Modified);
       ctx.SaveChanges();
   }
}

Url url = GetOneUrl();
url.UrsString = "http://google.com"; //I just change the content.
SaveToDB(url);

或者

public void SaveToDB(Url url)
{
    using(ServicesEntities ctx = new ServicesEntities())
    {
        var t = ctx.GetObjectByKey(_Url.EntityKey) as Url;
        t = url; //this will make t.UrlString becomes "http://google.com"
        ctx.ApplyCurrentValues<Url>("Urls", t);
        ctx.SaveChanges();
    }
}

这种方式也适用于我。

第一种方法会生成 sql 语句来更新 Url 表的所有列,但第二种方法将提供一个 sql 脚本只更新“UrlString”列。

他们都必须从数据库中检索一个临时实体对象,即上述代码中的“t”。

有没有其他方法可以达到这个目的?或者你知道的其他更好的方法?或者关于这个话题的任何官方解决方案?

非常感谢。

4

1 回答 1

0

我不明白你的第一个例子。为什么你首先从 获得实体ObjectContext?它不是必需的,因为您刚刚创建了上下文的新实例。您可以使用:

public void SaveToDB(Url url)
{
   using(ServicesEntities ctx = new ServicesEntities())
   {
       ctx.Attach(url);
       ctx.ObjectStateManager.ChangeObjectState(url, System.Data.EntityState.Modified);
       ctx.SaveChanges();
   }
}

在您的第二个示例中,您可以调用:

public void SaveToDB(Url url) 
{     
  using(ServicesEntities ctx = new ServicesEntities())     
  {         
     var t = ctx.GetObjectByKey(_Url.EntityKey) as Url; // Ensures that old values are loaded
     ctx.ApplyCurrentValues<Url>("Urls", url);         
     ctx.SaveChanges();     
  } 
} 

现在两种方法之间的区别很明显。第一种方法 ( Attach) 不需要先查询数据库。第二种方法 ( ApplyCurrentValues) 需要先查询数据库以获取旧值。

您可以使用另外两种方法。首先是您以前方法的扩展。它允许您定义更改了哪些属性。第二种方法是与加载的实体手动同步。这种方法不使用任何特殊方法。您只需手动将加载实体的属性设置为所需的值。如果您使用对象图而不是单个实体,则此方法很有用,因为 EF 无法自动同步关系中的更改。

于 2011-02-07T09:07:13.230 回答