C# - Entity Framework将新对象添加到ObjectContext

时间:2010-07-14 19:48:19

标签: c# entity-framework devexpress xtragrid objectcontext

我正在使用Entity Framework,SQL和C#。

我有一个名为Client的表,其他名为clients_phone。

我有一个带有Xtragrid的表单并使用BindingSource我将IQueryable绑定到网格。

myBindingSource = new BindingSource();
myBindingSource.DataSource = clients;  //Clients it is the IQueryable<Client>
myBindingSource.DataMember = "clients_phone";
myBindingSource.AllowNew = true;

然后,我想在我的客户端添加一个新的clients_phone。为此,我创建一个新客户端(),然后添加电话。

clients newclient = objContext.CreateObject<clients>();

newclient.clients_phone = newClients_Phone;

objContext.AddObject("Clients", newclient);

最后我在ObjectContext中添加了新的clients_phone,但是当我看到Xtrag clients_phone没有显示时。

知道会发生什么事吗??。

由于

3 个答案:

答案 0 :(得分:2)

Lucas B是对的。每当你想要添加所有新客户端和Clients_phone时,你需要调用SaveChanges()方法以便将数据保存到数据库中。

是否需要先创建客户端,然后执行更新以添加更多client_phone条目或其他任何内容。如果你从未调用过SaveChanges()方法,你所做的任何事情都将被保存回数据库。

答案 1 :(得分:1)

您是否尝试过保存并提交对象?

objContext.SaveChanges(true);

objContext.AcceptAllChanges();

答案 2 :(得分:0)

我已经完成了 SaveChanges(),但我认为这是一种解决方法。

回溯:当用户取消操作时,新对象将在数据库中。

用例:“创建人”

  1. 用户选择名为“创建人”的菜单项(或按钮或其他)(例如,新用户应出现在GridView控件中 - 调用SaveChanges())
  2. 用户填写名字,姓氏等。
  3. 然后用户发现他不需要创建那个人(例如用户记得他昨天已经创建了那个人)
  4. 用户没有按下保存按钮(菜单项或其他;-))他使用“取消”菜单项(或按钮或其他) - 因此数据库中将有一个孤儿人
  5. 其他方法:为了将新人(尚未提交)添加到GridView控件,您可以将DataSource设置为“当前人+新人”

        private object GetBindingList(ObjectSet<Person> contextObjects, Person newObject)
    {
      List<Person> list = new List<Person>();
    
      list.AddRange(contextObjects);
      list.Add(newObject);
    
      return list;
    }
    

    用法:

    PersonsBindingSource.DataSource = GetBindingList(Context.PersonSet, newPerson);
    

    但这有一个缺点: 它只是第一次工作......所以你需要做类似的事情:

    PersonsBindingSource.DataSource = GetBindingList(Context.PersonSet, newPerson);
    Context.PersonSet = Populate with persons from PersonsBindingSource.DataSource // ;-)
    

    但是为什么是contextObjects.AddObject(newObject);不工作(新项目不会显示在GridView中 - 只有没有外键到其他对象的对象才会出现问题)

    仅在调用 SaveChanges()

    时才有效
    PersonsBindingSource.DataSource = Context.PersonSet.Execute(MergeOption.AppendOnly);