2014-03-26 89 views
13

在我的数据库中加载相关对象时出现异常。我正在加载所有的MatchData对象,我想用foreach对它们进行迭代。加载相关对象时出现异常。实体框架

的对象我加载是:

MatchData类:

public class MatchData 
{ 
    [Key] 
    public virtual int Id { get; set; } 
    private List<PlayerData> blueTeam = new List<PlayerData>(); 
    private List<PlayerData> redTeam = new List<PlayerData>(); 

    [InverseProperty("MatchDataBlue")] 
    public virtual List<PlayerData> BlueTeam 
    { 
     get { return blueTeam; } 
     set { blueTeam = value; } 
    } 
    [InverseProperty("MatchDataRed")] 
    public virtual List<PlayerData> RedTeam 
    { 
     get { return redTeam; } 
     set { redTeam = value; } 
    } 
} 

PlayerData类:

public class PlayerData 
{ 

    // properties 
    [Key] 
    public virtual int Id { get; set; } 

    public virtual Player Player { get; set; } 
    public virtual MatchData MatchDataBlue { get; set; } 
    public virtual MatchData MatchDataRed { get; set; } 
} 

这是我如何加载它们的MatchData对象:

using (DBBooneContext db = new DBBooneContext()) 
{ 
    var smth = db.MatchData 
     .Include(md => md.BlueTeam) 
     .ToList(); 
} 

的DbContext

class DBBooneContext : DbContext 
{ 
    public DbSet<Player> Player { get; set; } 
    public DbSet<PlayerData> PlayerData { get; set; } 
    public DbSet<MatchData> MatchData { get; set; } 
} 

当我运行ToList我得到异常: 型 'System.Reflection.TargetInvocationException' 未处理的异常发生在EntityFramework.SqlServer.dll

完全例外:

A first chance exception of type 'System.Reflection.TargetInvocationException' occurred in EntityFramework.SqlServer.dll 
System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.InvalidOperationException: The class 'Boonekamp.ClassCollection.PlayerData' has no parameterless constructor. 
    at System.Data.Entity.Core.Objects.DelegateFactory.GetConstructorForType(Type type) 
    at System.Data.Entity.Core.Common.Internal.Materialization.Translator.TranslatorVisitor.Emit_ConstructEntity(EntityType oSpaceType, IEnumerable`1 propertyBindings, Expression entityKeyReader, Expression entitySetReader, TranslatorArg arg, EntityProxyTypeInfo proxyTypeInfo) 
    at System.Data.Entity.Core.Common.Internal.Materialization.Translator.TranslatorVisitor.Visit(EntityColumnMap columnMap, TranslatorArg arg) 
    at System.Data.Entity.Core.Query.InternalTrees.EntityColumnMap.Accept[TResultType,TArgType](ColumnMapVisitorWithResults`2 visitor, TArgType arg) 
    at System.Data.Entity.Core.Common.Internal.Materialization.Translator.TranslatorVisitor.HandleSpandexRecord(RecordColumnMap columnMap, TranslatorArg arg, RowType spanRowType) 
    at System.Data.Entity.Core.Common.Internal.Materialization.Translator.TranslatorVisitor.Visit(RecordColumnMap columnMap, TranslatorArg arg) 
    at System.Data.Entity.Core.Query.InternalTrees.RecordColumnMap.Accept[TResultType,TArgType](ColumnMapVisitorWithResults`2 visitor, TArgType arg) 
    at System.Data.Entity.Core.Common.Internal.Materialization.Translator.TranslatorVisitor.ProcessCollectionColumnMap(CollectionColumnMap columnMap, TranslatorArg arg, ColumnMap discriminatorColumnMap, Object discriminatorValue) 
    at System.Data.Entity.Core.Common.Internal.Materialization.Translator.TranslatorVisitor.Visit(DiscriminatedCollectionColumnMap columnMap, TranslatorArg arg) 
    at System.Data.Entity.Core.Query.InternalTrees.DiscriminatedCollectionColumnMap.Accept[TResultType,TArgType](ColumnMapVisitorWithResults`2 visitor, TArgType arg) 
    at System.Data.Entity.Core.Common.Internal.Materialization.Translator.TranslatorVisitor.AcceptWithMappedType(TranslatorVisitor translatorVisitor, ColumnMap columnMap) 
    at System.Data.Entity.Core.Common.Internal.Materialization.Translator.TranslatorVisitor.HandleSpandexRecord(RecordColumnMap columnMap, TranslatorArg arg, RowType spanRowType) 
    at System.Data.Entity.Core.Common.Internal.Materialization.Translator.TranslatorVisitor.Visit(RecordColumnMap columnMap, TranslatorArg arg) 
    at System.Data.Entity.Core.Query.InternalTrees.RecordColumnMap.Accept[TResultType,TArgType](ColumnMapVisitorWithResults`2 visitor, TArgType arg) 
    at System.Data.Entity.Core.Common.Internal.Materialization.Translator.TranslatorVisitor.ProcessCollectionColumnMap(CollectionColumnMap columnMap, TranslatorArg arg, ColumnMap discriminatorColumnMap, Object discriminatorValue) 
    at System.Data.Entity.Core.Common.Internal.Materialization.Translator.TranslatorVisitor.ProcessCollectionColumnMap(CollectionColumnMap columnMap, TranslatorArg arg) 
    at System.Data.Entity.Core.Common.Internal.Materialization.Translator.TranslatorVisitor.Visit(SimpleCollectionColumnMap columnMap, TranslatorArg arg) 
    at System.Data.Entity.Core.Query.InternalTrees.SimpleCollectionColumnMap.Accept[TResultType,TArgType](ColumnMapVisitorWithResults`2 visitor, TArgType arg) 
    at System.Data.Entity.Core.Common.Internal.Materialization.Translator.TranslateColumnMap[T](ColumnMap columnMap, MetadataWorkspace workspace, SpanIndex spanIndex, MergeOption mergeOption, Boolean streaming, Boolean valueLayer) 
    --- End of inner exception stack trace --- 
    at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor) 
    at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments) 
    at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) 
    at System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters) 
    at System.Data.Entity.Core.Common.Internal.Materialization.Translator.TranslateColumnMap(Translator translator, Type elementType, ColumnMap columnMap, MetadataWorkspace workspace, SpanIndex spanIndex, MergeOption mergeOption, Boolean streaming, Boolean valueLayer) 
    at System.Data.Entity.Core.Objects.Internal.ObjectQueryExecutionPlanFactory.Prepare(ObjectContext context, DbQueryCommandTree tree, Type elementType, MergeOption mergeOption, Boolean streaming, Span span, IEnumerable`1 compiledQueryParameters, AliasGenerator aliasGenerator) 
    at System.Data.Entity.Core.Objects.EntitySqlQueryState.GetExecutionPlan(Nullable`1 forMergeOption) 
    at System.Data.Entity.Core.Objects.ObjectQuery`1.<>c__DisplayClass7.<GetResults>b__6() 
    at System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction[T](Func`1 func, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction, Boolean releaseConnectionOnSuccess) 
    at System.Data.Entity.Core.Objects.ObjectQuery`1.<>c__DisplayClass7.<GetResults>b__5() 
    at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute[TResult](Func`1 operation) 
    at System.Data.Entity.Core.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption) 
    at System.Data.Entity.Core.Objects.ObjectQuery`1.<System.Collections.Generic.IEnumerable<T>.GetEnumerator>b__0() 
    at System.Data.Entity.Internal.LazyEnumerator`1.MoveNext() 
    at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) 
    at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source) 
    at Boonekamp.ClassCollection.Player.getStats(Predicate`1 predicate) in d:\Dropbox\code\c#\Boonekamp\Boonekamp\ClassCollection\Player.cs:line 49 

Additional information: Exception has been thrown by the target of an invocation. 

我绝对没有线索如何解决这个问题。有任何想法吗?

+0

调用ToList()会在EntityFramework.SqlServer.dll中引起调用错误,这似乎很奇怪。我的猜测是这是一个不同的问题。你能否显示你的DBBooneContext实现(包括你定义的任何约定和/或配置)? –

+0

@BrianDriscoll:为你更新的排队:) –

+0

不幸的是,它不像我所希望的那样令人赞叹。我想知道是否有潜在的数据库问题。你的数据库模式是什么样的?如果您从'using'块中删除“Include”或“ToList”调用,是否会发生任何变化? –

回答

21

内部异常说明了一切:

类 'Boonekamp.ClassCollection.PlayerData' 没有无参数的构造函数

更改PlayerData到:

[Obsolete("Only needed for serialization and materialization", true)] 
public PlayerData() {} 

public PlayerData(Player player) 
{ 
} 

这方式,你确实有一个无参数的构造函数,Entity Framework可以在initializat期间使用离子。但是,您可以使用[Obsolete]属性防止在代码中使用该构造函数。

+2

哦,上帝,我需要开始阅读那些内部的异常。 非常感谢Haim!我得到它的工作 –

+1

你可以标记你的构造函数为私有。不需要oblolete属性。如下所示:http://stackoverflow.com/a/31543487/1806239。 – IFink

相关问题