【发布时间】: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 来执行UPDATE
或DELETE
在我的应用程序中处理后的原始记录,例如: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