【问题标题】:Casting to and from Derived Types using LINQ使用 LINQ 转换为派生类型和从派生类型转换
【发布时间】:2012-11-21 21:41:09
【问题描述】:

我对使用 LINQ 和实体框架有点陌生,并且在将实体框架对象类型转换为/从从该对象类型派生的类的对象中转换时遇到了障碍。

为了提供上下文,我从我的 Entity Framework DB 中选择 Survey 对象(来自 Surveys 表的记录),为此我创建了一个派生类,我将在使用它们之前将这些实体对象实际转换为我的应用程序 - 派生类的签名看起来像:

public sealed class SurveyExtended : Survey
{
    public SurveyExtended() : base()
    {
        // non-base class members initialized here
    }
}

当使用 LINQ 填充这些对象的集合时,我使用类似于以下的代码将它们转换为 SurveyExtended 类型:

var listOfSurveyExtendedObjects = ( from record in contextFactory.SurveysDbContext.Surveys  
                                    select new SurveyExtended()
                                               {
                                                  Name = record.Name,
                                                  Data = record.Data,
                                                  Date = record.Date
                                               }
                                  );

请注意,我知道我可以使用 lambda 来做同样的事情,但我只是想说明一个概念。

一切都很好,直到我真正尝试对SurveysDbContext 执行DML 来执行UPDATEDELETE 在我的应用程序中处理后的原始记录,例如:contextFactory.SurveysDbContext.Surveys.DeleteObject( surveyExtendedObject );

这当然行不通,因为我正在操作SurveyExtended 对象,而不是原始Survey 实体对象,而ObjectStateManager 将抛出InvalidOperationException,因为找不到对象本身.这是意料之中的事。

我想我正在寻找的是针对这种情况的建议和替代方法。我应该在尝试DbContext.DeleteObject( record ); 之前尝试转换回Survey 对象,还是完全改变我解决这个问题的方法?在类似情况下,您使用/使用了哪些方法,它们提供了哪些好处/缺点?

【问题讨论】:

  • 不知何故,你想坚持一只动物而不是一只狗,这对我来说听起来很奇怪。为什么要从实体继承非实体?
  • 因为在我的应用程序中设置/使用但未存储在数据库中的与此类实体关联的其他属性,因此与原始Survey 实体对象类型无关它的基本形式。关于你的比喻,我需要dog 在我的应用程序中成为doberman,因为它获得了更多不能推广到dog 的特征。处理完杜宾犬后,需要回去把原来的dog记录根据处理成功/不成功的两种方式之一去掉。
  • 我可能更喜欢组合来关联其他属性,所以SurveyExtended 包含Survey 作为成员+更多属性。然后删除将是DeleteObject(surveyExtendedObject.Survey)。否则,是的,将其转换为 Survey(但可能转换还不够,可能需要创建一个 Survey 并复制属性)。
  • 感谢您的帮助和投入~我会少做一些关于继承实体对象的跳跃,而不会意识到我必须跳过这个圈子:)

标签: c# .net linq entity-framework-4 casting


【解决方案1】:

想到的选项要么在保存/与 EF 交互之前将其强制转换,要么切换到使用类似装饰器模式的东西,其中扩展对象封装了调查。尽管第二个选项要么意味着您需要模仿封装对象暴露直通访问器(代码加倍,乐趣加倍)或更改引用代码以访问 SurveyExtended.Survey.Property

【讨论】: