Asp.net mvc 2 Entity-Framwork-4-在ASP.NET MVC2视图中上下文消失时访问外键属性

Asp.net mvc 2 Entity-Framwork-4-在ASP.NET MVC2视图中上下文消失时访问外键属性,asp.net-mvc-2,entity-framework-4,Asp.net Mvc 2,Entity Framework 4,我有一个包含此表的数据库: Customer - ID - Phone - Cell - Fax PhoneList - ID - PrefixID - Number Prefix - ID - Number 每个电话客户列到电话列表ID之间有一个FK(另一个是从prefixID到table prefix上的ID) 我已经使用VS2010将DB导入edmx文件。 我得到了PhoneList、PhoneList1、PhoneList2属性-已生成(Q1:如何将其更改为其他名称?) 在ASP.

我有一个包含此表的数据库:

Customer
- ID
- Phone
- Cell
- Fax

PhoneList
- ID
- PrefixID
- Number

Prefix
- ID
- Number
每个电话客户列到电话列表ID之间有一个FK(另一个是从prefixID到table prefix上的ID)

我已经使用VS2010将DB导入edmx文件。 我得到了PhoneList、PhoneList1、PhoneList2属性-已生成(Q1:如何将其更改为其他名称?) 在ASP.NET MVC模型类库中,我使用以下方法获取客户列表:

var customers=上下文中的c。客户选择c

并将结果发送给控制器:

返回customersTable.AsQueryable()

问题-我可以在视图中访问Customer的所有常规属性,但一旦访问PhoneList(代表电话号码对象的自动生成的),我就会出现此错误-因为上下文早已消失并在模型端关闭:

The ObjectContext instance has been disposed and can no longer be used for operations that require a connection.
Q2:我应该如何处理这种情况-我如何确保我需要的数据“停留”/从数据库检索(另一方面,我不需要加载的其他FK不加载)

(Q2-是“真实”问题,请在Q1回答。)

我正在使用ASP.NETMVC2,EF-4


谢谢。

您不应该在视图中使用实体框架类。您应该定义和使用视图模型。视图模型是专为给定视图的需要而设计的类。因此,您可能有来自同一模型的多个视图模型(视图模型是模型的子集)或映射到多个模型类的单个视图模型(在本例中,视图模型是多个模型的超集)。因此,基本上您将拥有一个存储库,负责从某处(数据库、文件、远程服务等)获取模型,然后将此模型转换为视图模型,并将此视图模型传递给控制器

因此,在您的存储库中,您可以创建子实体以避免出现此类异常


然后,您将使用特定于给定视图的必要显示属性装饰视图模型类。您可以使用在模型和视图模型之间进行转换。

Q1:双击EDMX文件时,您应该能够使用在Visual Studio中打开的编辑器编辑名称


问题2:要么保持上下文的打开状态(如果这是一个选项),要么使用您可以访问的Include方法(不记得是off IDbSet还是ObjectQuery。

q:viewmodels应该在UI项目中定义。填充viewmodel时,我会不会面临同样的问题?如果我正确理解了答案的第二部分,我是否应该为每个EF类创建一个模型类,然后填充并传递它,而不是自动生成的类这些类将成为我的viewmodels的子集?这不是一种“浪费”吗关于我从EF获得的自动生成的模型?@Dani,是的,视图模型应该在UI项目中定义,因为它们与视图相关联。你应该创建一个视图模型,该视图模型特定于视图的需要,并传递该视图模型而不是EF类。不,这不是浪费自动生成的模型类。@Darin,我确信我理解-我需要在模型项目中定义一个模型类,用我从linq获得的自动生成类中的数据填充它,将该类发送到UI,然后在那里我将它放在一个视图模型中,该视图模型满足我的视图需求。因此,我从edmx中有一个customer类,一个customer类是我在模型项目中手动创建的,然后我将将该特定视图的最后一个类放在viewmodel中。这是正确的方法吗?@Dani,不,这不对,假设您有一个自动生成的员工EF模型,该模型具有Id、FirstName、LastName、BirthDate和大量其他属性。现在您有了一个视图,该视图要求您仅显示格式为货币的工资和全名在您的UI层(MVC应用程序)中使用以下属性定义EmployeeViewModel:Salary、FullName,并用必要的显示格式属性修饰Salary属性。在控制器中,使用AutoMapper在Employee和EmployeeViewModel之间执行转换,并将视图模型传递给视图。@Darin-另一个问题。-我是否能够更新对象由于它不再链接到EF检索到的原始对象?谢谢,关于Q1-当我由于DB更改而更新EDMX时,这些手动更改会保留吗?关于Q2-保持上下文打开是错误的…我将查找include方法的含义..在说“保持上下文打开”之后,我应该"但请确保在完成后正确清理。如果使用IoC,这将更有意义。关于QA1:EF的主要目的之一是不要求对象模型与数据库模型匹配,因此这应该是非常可能的。EDMX基本上包含对象的形状、数据库模型的形状以及介于两者之间。