【问题标题】:Asp.Net MVC Entity Framework Parent-Child with overridable values具有可覆盖值的 Asp.Net MVC 实体框架父子
【发布时间】:2009-08-17 08:50:25
【问题描述】:

好的,让我解释一下我正在尝试做的事情。

我有一个名为 WebsitePage 的表,其中包含我网站上的所有页面以及有关它们的一些信息。然后,我为所有客户创建了一个 Customer 表。然后我有另一个名为 CustomerWebsitePage 的表,它存储了 WebsitePage 表中某些列的客户值。

所以,使用实体框架,我导入了这三个表。我想要做的是返回一个强类型的 WebsitePage 列表,如果它有任何值,则该列表具有来自 CustomerWebsitePage 的任何值。例如,假设我的一位客户为我的一个网站页面添加了 CustomerWebsitePageName。在这种情况下,我想返回包含 CustomerWebsitePageName 而不是 WebsitePage Name 的 WebsitePages 列表。但是其他所有内容的原始网站页面名称都没有被覆盖。

这里的关键是我的 WebsitePage 表有一个外键,用于父/子关系。所以,我也想同时返回子网站页面。我尝试使用函数导入来获得我想要的东西,但是我当然丢失了 ChildPages。

我已经尝试了几乎所有方法来使用 Entity 框架和 LINQ 获得我想要的东西。但到目前为止,我尝试的几乎所有事情都以抛出异常告终。以下是一些:

  • EntityCollection 已初始化
  • 无法在 LINQ to Entities 查询中构造实体或复杂类型“MyEntityModel.WebsitePage”。

我对如何解决所有这些问题有一个想法,那就是将 ParentPageID 复制到我的 WebsitePage 表中,但这似乎违反了很多原则,我真的不想添加与此相关的维护头痛。

有人知道如何完成这种事情吗?

A simple DB diagram. http://images.tehone.com/screenshots/2009-08-17_013009.png

【问题讨论】:

  • 看起来您编写了一个错误的 LINQ to Entities 查询,但实际上没有看到该查询和使用它的代码,因此很难确定。乍一看,您的数据库映射看起来还不错。

标签: asp.net-mvc linq entity-framework linq-to-entities


【解决方案1】:

您需要返回的对象是 CustomerWebsitePage 而不是 WebsitePage。原因是您返回的任何对象都必须了解客户,因为属性需要它来确定使用哪个字段(CustomerPage 或 WebsitePage)。

考虑到这一点,您可以有一个函数 CustomerWebsitePage.GetAllPagesForCustomer(Customer c),它会返回一个页面枚举。但是,要实现您正在寻找的功能,您必须在 CustomerWebsitePage 中实现一些通读属性。让我们以名称为例。以下是如何在 CustomerWebsitePage 中实现它:

public string Name
{
    get{ if( String.IsNullOrEmpty(CustomerWebsitePageName) ) 
            return WebsitePage.Name;
         return CustomerWebsitePageName; }
}

对于子页面,您可以有一个属性:

public IEnumerable<CustomerWebPage> Children
{
   get
   {
      return WebsitePage.Children.Select( it => it.Customer.CustomerID == this.CustomerID );       }
}

请注意,使用此设置,您无法对这些新字段运行 EF Linq 查询(因为它们仅存在于对象本身中,而不存在于数据库映射中)。如果您想无缝加载所有子项,您可以使用 Load() 来添加代码,但这会降低性能。为确保所有子项都已加载,请尝试以下加载函数:

IEnumerable<CusomterWebPage> GetAllPagesForCustomer(Customer c)  
{
    return Context.CustomerWebPageSet.Include("WebsitePage").Where( it => it.Customer.CustomerID == c.CustomerID );
}

【讨论】:

  • 感谢您的建议。我决定完全走一条不同的路线,不使用强类型对象进行覆盖。相反,我只是在这些数据的循环中自己处理它。我想我可以说这是在尝试通过覆盖某些值来进行这种继承时使用实体框架的限制。谁知道,我什至可以使用实体框架来创建这种继承。但至少现在,我只是手动处理它。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多