C# 数据绑定问题

C# 数据绑定问题,c#,entity-framework,C#,Entity Framework,我最近开始使用实体框架,认为它非常好,但我对一些事情感到困惑 我正在编写一个winforms应用程序,其中会向您显示一个列表中的人员列表,如果您单击某个特定人员,有关该人员的更多信息将显示在文本框中。到目前为止还没有什么特别之处,但是您应该能够编辑关于此人的数据,因此数据绑定在这里很好 它工作得很好,但我有点困惑什么是正确的方法来做它。首先我喜欢这样: var query = _context.Person.Where(c => c.Id == chosenId); this.person

我最近开始使用实体框架,认为它非常好,但我对一些事情感到困惑

我正在编写一个winforms应用程序,其中会向您显示一个列表中的人员列表,如果您单击某个特定人员,有关该人员的更多信息将显示在文本框中。到目前为止还没有什么特别之处,但是您应该能够编辑关于此人的数据,因此数据绑定在这里很好

它工作得很好,但我有点困惑什么是正确的方法来做它。首先我喜欢这样:

var query = _context.Person.Where(c => c.Id == chosenId);
this.personBindingSource.DataSource = query.ToList();
然后我读了一点,试着:

var local = _context.Person.Local;  
IEnumerable<Customer> enumerable = local.Where(c => c.Id == chosenId);
this.personBindingSource.DataSource = enumerable.ToList();

我现在有点困惑,什么是正确的方法,这三种方法之间有什么区别?有人能帮我吗?

第一个例子和第二个例子的唯一区别是一个推迟了,另一个没有。第三个有点不同,因为它在数据库和控制数据源之间创建了一个双向绑定,有效地使datacontext跟踪列表的更改(添加和删除)

在所有示例中,只要保持datacontext打开,就会跟踪对对象本身的更改

至于哪种方法是正确的,这取决于您的应用程序。根据您的目标选择最适合您的方法

取决于您的目标 老实说,我从来都不喜欢得到这个答案,因为它似乎是所有问题的答案,但在这种情况下,它确实是我能给出的唯一答案

当地的地产是做什么的 Local为您提供了对数据上下文跟踪的当前元素的引用,这些元素没有被delete标记,本质上,您是在请求已被上下文加载到内存中的当前对象,您可以在此处阅读有关它的更多信息

Load方法的作用是什么 Load方法急切地加载目标上下文,您可以在这里阅读更多关于它的内容



ToBindingList做什么 基本上,这是在使用使用此方法创建的集合时,在已创建的任何实体和UI之间创建双向绑定。也就是说,UI中的任何更改都应自动反映在此集合中的相关实体中。您可以通过以下链接了解更多信息






你的每个例子都做了什么 第一个例子 在封面下,下面正在进行

  • 使用linq表达式创建要由服务器处理的查询从数据库中获取内容并在其周围创建列表
  • 在这里,您可以从数据库中抓取Id为Selected Id的任何人,然后将他们加载到应用程序中并创建一个列表

    第二个例子 在封面下,下面正在进行

  • 您正在将所有人员加载到本地内存中
  • 您创建了绑定列表(允许对象和UI之间的双向数据绑定)
  • 您将列表绑定到UI元素personBindingSource
  • 除非您希望将所有项加载到内存中,否则这可能不是您想要做的,如果数据集变得足够大,它将减慢您的程序,并可能导致其无法正常工作(在大多数情况下,对于person来说,这不太可能,但是可能的)

    什么时候应该使用它们
    第一个当您只想将与查询匹配的数据获取到本地内存中,并且不需要UI和实体之间的链接时

    第二个当您已经在上下文中运行查询,并且需要在其他地方使用它,但不需要重新运行查询,因为它当前在内存中时

    第三个当您想加载所有将实体的元素设置到内存中,并在它们和控件之间创建双向数据绑定

    谢谢您的回答!哇!回答得很好,谢谢!有一件事是你。当我使用'First'并在UI中更改一个值,然后使用context.SaveChanges()时,该更改实际上会保留在数据库中。根据我在“什么时候应该使用它们”->“First”部分中的理解,不应该有任何可用的链接,但在这种情况下也必须有活动的数据绑定。或者我误解了你的意思吗?一般来说,你不能依赖这些变化被保留下来,在某些情况下它们可能会保留下来,但在另一些情况下它们可能不会。我认为list对象不需要更新数据绑定的更改,BindList确实将此作为其定义的一部分。
    _context.Person.Load();
    this.personBindingSource.DataSource = _context.Person.Local.ToBindingList();
    
    var query = _context.Person.Where(c => c.Id == chosenId);
    this.personBindingSource.DataSource = query.ToList();
    
    var local = _context.Person.Local;  
    IEnumerable<Customer> enumerable = local.Where(c => c.Id == chosenId);
    this.personBindingSource.DataSource = enumerable.ToList();
    
    _context.Person.Load();
    this.personBindingSource.DataSource = _context.Person.Local.ToBindingList();