Entity framework 实体框架继承
我已经研究了几个可能的解决方案,但没有找到正确的解决方案 我需要一个完整的集合,也就是说,我需要获取也是基类型的类型。i、 e.ActionHistory类型以及从ActionHistory基类继承的所有其他类型。我的问题是我获取了所有实体,但ActionUpdate类型的实体没有填充ActionUpdateDetails集合 我的问题是无法在派生的ActionUpdate类中检索ActionUpdateDetails数据 模型中有三个类:Entity framework 实体框架继承,entity-framework,inheritance,Entity Framework,Inheritance,我已经研究了几个可能的解决方案,但没有找到正确的解决方案 我需要一个完整的集合,也就是说,我需要获取也是基类型的类型。i、 e.ActionHistory类型以及从ActionHistory基类继承的所有其他类型。我的问题是我获取了所有实体,但ActionUpdate类型的实体没有填充ActionUpdateDetails集合 我的问题是无法在派生的ActionUpdate类中检索ActionUpdateDetails数据 模型中有三个类: public class ActionHistory
public class ActionHistory
{
public int Id {get;set;}
}
public class ActionUpdate : ActionHistory
{
public ICollection<ActionUpdateDetail> ActionUpdateDetails{get;set;}
}
public class ActionUpdateDetail
{
int Id{get;set;}
public string Field{get;set;}
public string Value{get;set;}
}
我得到的只是异常消息:
无法创建“System.Collections.Generic.ICollection”“1”类型的常量值。在此上下文中仅支持基本类型(“如Int32、String和Guid”)
然后我试着模拟EF之外的情况,结果成功了。我正在使用一个POCO模型,并已将涉及的类提取到一个单独的项目中,用数据填充结构样本,并成功地对其进行了测试,即,ActionUpdateDetails集合中填充了数据
在此方面的任何帮助都将不胜感激
N.关于你的答案,实际上,正确的方法是使用
类型的:
var actionUpdateDetails=ctx.ActionHistories
第()类
.Select(x=>x.ActionUpdateDetails)
.ToList();
这会导致数据库端筛选器(内部联接),而您的解决方案会对可能不是该类型的项执行隐式强制转换-在这种情况下,您可能会得到一个空引用异常。关于您的答案,实际上,正确的方法是使用类型的:
var actionUpdateDetails=ctx.ActionHistories
第()类
.Select(x=>x.ActionUpdateDetails)
.ToList();
这会导致数据库端筛选器(内部联接),而您的解决方案对可能不是该类型的项执行隐式强制转换-在这种情况下,您可能会得到一个空引用异常。实际上,我忘了提到我需要一个完整集,也就是说,我需要获取也属于基类型的类型。i、 e.ActionHistory类型以及从ActionHistory基类继承的所有其他类型。我的问题是我获取了所有实体,但ActionUpdate类型的实体没有填充ActionUpdateDetails集合。我提出的解决方案有一个(可能更多)副作用,它不会因为扩展的anon.type而追溯到ActionHistory:(啊,我没有注意到,在你的Q中,你没有使用抽象类。这会让生活变得困难,特别是在急切加载的情况下(如你所发现的)。那么你可能做对了。不,没有抽象类,你知道如何正确地做吗?不,没有抽象类,可以创建“基”,因此你失去了很多多态技巧(项必须始终是派生项之一,基不能实例化,等等)。如果可能的话,你应该转移到抽象类。ActionHistory
类中除了ID之外什么都没有-那为什么还要有基呢?事实上我忘了提到我需要一个完整的集合,也就是说,我需要获取也属于基类型的类型。即ActionHistory类型,以及从Act继承的所有其他类型ionHistory基类。我的问题是我获取了所有实体,但ActionUpdate类型的实体没有填充ActionUpdateDetails集合。我提出的解决方案有一个(可能更多)副作用,它不会因为扩展的anon类型而回溯到ActionHistory。类型:(啊,我没有注意到,在你的Q-中,你没有使用抽象类。这让生活变得困难,尤其是在急切加载的情况下(正如你所发现的)。你当时可能做了正确的事情。不,没有抽象类,你知道如何正确地做到这一点吗?没有。没有抽象类,“基础”可以创建,所以您会丢失很多多态技巧(项必须始终是派生项之一,基不能实例化,等等)。如果可能,您应该移动到抽象类。ActionHistory
类中除了ID之外什么都并没有-那个么为什么还要有基呢?
var result = from actionHistory in ActionHistories
select new {
actionHistory,
actionUpdateDetails = actionHistory is ActionUpdate ?
(actionHistory as ActionUpdate).ActionUpdateDetails : null
};
var result = from actionHistory in ActionHistories
select new
{
actionHistory,
ActionUpdateDetails = (actionHistory as ActionUpdate).ActionUpdateDetails
};
var actionUpdateDetails = ctx.ActionHistories
.OfType<ActionUpdate>()
.Select(x => x.ActionUpdateDetails)
.ToList();