0

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

为了提供上下文,我Survey从我的 Entity Framework DB 中选择对象(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 来做同样的事情,但我只是想说明一个概念。

一切都很好,直到我在我的应用程序中处理它之后实际尝试执行 DMLSurveysDbContext以执行类似UPDATEDELETE原始记录之类的操作,例如:contextFactory.SurveysDbContext.Surveys.DeleteObject( surveyExtendedObject );.

当然这是行不通的,因为我正在操作SurveyExtended对象,而不是原始Survey实体对象,并且ObjectStateManager会抛出一个,InvalidOperationException因为找不到对象本身。这是可以预料的。

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

4

1 回答 1

1

想到的选项要么在保存/与 EF 交互之前将其转换回来,要么切换到使用扩展对象封装调查的装饰器模式之类的东西。尽管第二个选项要么意味着您需要模仿封装对象公开传递访问器(代码加倍,乐趣加倍),要么将引用代码更改为 access SurveyExtended.Survey.Property

于 2012-11-21T22:03:38.217 回答