我对使用 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
以执行类似UPDATE
或DELETE
原始记录之类的操作,例如:contextFactory.SurveysDbContext.Surveys.DeleteObject( surveyExtendedObject );
.
当然这是行不通的,因为我正在操作SurveyExtended
对象,而不是原始Survey
实体对象,并且ObjectStateManager
会抛出一个,InvalidOperationException
因为找不到对象本身。这是可以预料的。
我想我正在寻找的是针对这种情况的建议和替代方法。我应该在尝试之前尝试回退到Survey
对象DbContext.DeleteObject( record );
,还是完全改变我解决这个问题的方法?在类似情况下,您使用/使用了哪些方法,它们提供了哪些好处/缺点?