Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架-ObjectContext生命周期_C#_Entity Framework - Fatal编程技术网

C# 实体框架-ObjectContext生命周期

C# 实体框架-ObjectContext生命周期,c#,entity-framework,C#,Entity Framework,我不熟悉实体框架,对“数据库优先”WinForm应用程序中的ObjectContext生命周期有疑问 为了便于说明,假设我正在创建一个动物物种登记册 在表格的左边,我有一个动物种类的列表(牛、猪、狗等)——我认为这些是属而不是种,但没关系 在表单的右侧,我有文本框、组合框等,可以显示并允许编辑所选物种的属性 当用户选择左侧的物种时,我使用: var species = context.Single(x => x.id == speciesID); 然后将右侧的各种控件绑定到物种 其

我不熟悉实体框架,对“数据库优先”WinForm应用程序中的
ObjectContext
生命周期有疑问

为了便于说明,假设我正在创建一个动物物种登记册

  • 在表格的左边,我有一个动物种类的列表(牛、猪、狗等)——我认为这些是属而不是种,但没关系

  • 在表单的右侧,我有文本框、组合框等,可以显示并允许编辑所选物种的属性

当用户选择左侧的物种时,我使用:

var species = context.Single(x =>  x.id == speciesID);
然后将右侧的各种控件绑定到
物种

其中一些属性(如habitat)是从组合框中选择的(在加载表单时从数据库填充。我在数据库中使用代理键),这意味着我认为我需要在表单的生命周期中保持相同的上下文

我认为这有两个问题:

  • 用户可以在上下文的生命周期中对许多不同的物种(数百种)进行更改,使其变得臃肿

  • 理想情况下,如果用户希望在更改前保存对当前物种的更改(如果不干净),我希望在选择新物种时提示用户。那么,我如何放弃更改?我如何使上下文忘记它曾经看到过对象

  • 另一种方法是每次用户选择一个新物种时使用一个新的上下文,但这意味着每次都要重新填充几个组合框,以便它们在同一上下文中创建并可以绑定到

    我错过什么了吗


    非常感谢

    我想你会在这个主题中找到答案:


    我建议在物种变化上使用新的背景——这将解决在需要时撤销变化的问题


    我不明白为什么每次丢弃上下文时都需要重新填充组合框。我假设这些实体不会在物种被修改的同时被修改。因此,您可以对这些实体使用方法使其成为当前对象上下文的一部分(或者使用所选实体的键/id从具有当前对象上下文的数据库中查询实体)

    我认为放弃更改的最好方法是处理上下文并重新填充它。由于EF使用延迟加载(除非另有设置),所以您不会得到任何实际不使用的内容。EF上下文是通过工作单元模式使用的。谢谢,我喜欢第一个选项的声音,但是我如何从组合框中附加所有实体?假设我有
    iquiryable栖息地我是否需要枚举并调用每个附加?我不确定我是否理解您提到的第二个选项。@ChrisBeedie,您可以枚举所有栖息地并将它们附加到上下文,或者您只能在调用时附加所选栖息地以保存更改。在这两种情况下,您都可以使用通用代码来处理所有组合框。