我对使用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,以便在我的应用程序中处理原始记录后执行UPDATE
或DELETE
之类的事情,例如: contextFactory.SurveysDbContext.Surveys.DeleteObject( surveyExtendedObject );
。
当然这不起作用,因为我正在操纵SurveyExtended
个对象,而不是原始的Survey
实体对象,而ObjectStateManager
会抛出InvalidOperationException
因为无法找到对象本身。这是可以预期的。
我想我正在寻找的是这种情况的建议和替代方法。我应该在尝试Survey
之前尝试回放DbContext.DeleteObject( record );
个对象,还是完全改变我对此问题的处理方法?在类似的情况下,您使用了哪些方法/它们,以及它们提供了哪些好处/缺点?
答案 0 :(得分:1)
想到的选项要么在保存/与EF交互之前将其强制转换,要么切换到使用装饰模式之类的东西,其中Extended对象封装了Survey。虽然第二个选项要么意味着你需要模仿封装的对象公开传递访问器(加倍代码,加倍乐趣)或更改引用代码以访问SurveyExtended.Survey.Property
。