使用LINQ在派生类型之间进行强制转换

时间:2012-11-21 21:41:10

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

我对使用LINQ和Entity Framework有些新意,并且在将Entity Framework对象类型转换为从该对象类型派生的类的对象时遇到了麻烦。

为了提供上下文,我从我的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因为无法找到对象本身。这是可以预期的。

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

1 个答案:

答案 0 :(得分:1)

想到的选项要么在保存/与EF交互之前将其强制转换,要么切换到使用装饰模式之类的东西,其中Extended对象封装了Survey。虽然第二个选项要么意味着你需要模仿封装的对象公开传递访问器(加倍代码,加倍乐趣)或更改引用代码以访问SurveyExtended.Survey.Property