2014-03-26 57 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

相關問題