如何创建从多个数据库表中获取信息的视图模型对象

时间:2013-07-07 15:30:32

标签: c# asp.net-mvc entity-framework-4.1

我有以下表格: - enter image description here

但是如何在我的asp.net mvc4 web应用程序中创建一个视图模型类,这样如果我传递AccountDefinition.OrgID,我可以检索以下内容: -

•accountDefinition

•SDOrganization

•SDOrgPostalAddr

•AaaPostalAddress

我创建了以下CustomerDetails ViewModel

public class CustomerDetails
    {
        public AccountDefinition AccountDefinition {get; set;}
        public SDOrganization SDOrganization {get; set;}

        public virtual ICollection<AaaPostalAddress> AaaPostalAddress { get; set; }
 public virtual ICollection< SDOrgPostalAddr> AaaPostalAddress { get;set; }

    }

我有以下Repository方法,它应该根据ORG_ID填充CustomerDetails: -

public   CustomerDetails GetCustomer(int ORG_id) {

CustomerDetails cd = new CustomerDetails();
var cd = from SDorg in cd.AccountDefinition // here I will b populating the CustomerDetials
        }

我的第二个问题,因为我有数据库经验,我会做一个存储过程,将表连接在一起然后返回结果!!!,但因为我使用实体框架所以我对如何这样做?

BR

1 个答案:

答案 0 :(得分:1)

如果您已经从数据库模式创建了实体框架模型,那么您应该:

  • 具有AccountDefinition引用导航属性的AccountDefinition.SDOrganization类,因为两者之间的关系显然是一对一的

  • SDOrganization.AaaPostAddresses集合导航属性,因为该关系是多对多关系。 SDOrgPostalAddr表不应显示为模型实体,因为它只是多对多链接表

使用此模型并将视图模型更改为...

public class CustomerDetails
{
    public AccountDefinition AccountDefinition {get; set;}
    public SDOrganization SDOrganization {get; set;}

    public ICollection<AaaPostalAddress> AaaPostalAddresses { get; set; }
}

...您应该能够使用以下方式获得结果:

var customerDetails = context.AccountDefinitions
    .Where(a => a.OrgID == givenOrgID)
    .Select(a => new CustomerDetails
    {
        AccountDefinition = a,
        SDOrganization = a.SDOrganization,
        AaaPostalAddresses = a.SDOrganization.AaaPostalAddresses
    })
    .SingleOrDefault();

您还可以通过急切加载 AccountDefinition实体以及所需的导航属性来获取相同的数据:

var accountDefinition = context.AccountDefinitions
    .Include(a => a.SDOrganization.AaaPostalAddresses)
    .SingleOrDefault(a => a.OrgID == givenOrgID);