1

我正在使用实体框架、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。为此,我创建了一个 New Client(),然后添加了电话。

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

newclient.clients_phone = newClients_Phone;

objContext.AddObject("Clients", newclient);

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

知道会发生什么吗?

谢谢

4

3 回答 3

2

卢卡斯 B 是对的。每当您开始添加所有新的 Clients 和 Clients_phone 时,您需要调用 SaveChanges() 方法以便将数据持久保存到数据库中。

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

于 2011-08-10T15:42:20.063 回答
1

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

objContext.SaveChanges(true);

objContext.AcceptAllChanges();
于 2010-07-14T20:05:31.593 回答
0

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

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

用例:“创建人”

  1. 用户选择一个名为“创建人”的菜单项(或按钮或其他)(例如,新用户应出现在 GridView 控件中 - 调用 SaveChanges())
  2. 用户填写名字、姓氏等。
  3. 但随后用户发现他不需要创建那个人(例如,用户记得他昨天已经创建了那个人)
  4. 用户没有按下保存按钮(菜单项或其他任何东西;-))他使用“取消”菜单项(或按钮或其他任何东西) - 所以数据库中会有一个孤儿

其他方法:为了将新人员(尚未提交)添加到 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);
于 2011-11-16T15:10:32.443 回答