2017-06-13 137 views
0

的錯誤是System.InvalidCastException:無法投類型「System.String」的對象鍵入「System.Int32」

System.InvalidCastException occurred HResult=0x80004002 Message=Unable to 
    cast object of type 'System.String' to type 'System.Int32'. Source=<Cannot 
    evaluate the exception source> StackTrace: at 
Microsoft.EntityFrameworkCore.ChangeTracking.Internal.SimpleNullableDependentKeyValueFactory 1. TryCreateFromBuffer(ValueBuffer valueBuffer, TKey& key) at 
Microsoft.EntityFrameworkCore.Query.Internal.WeakReferenceIdentityMap`1.CreateIncludeKeyComparer(INavigation navigation, ValueBuffer valueBuffer) 

我不知道如何解決/解決這個錯誤。檢查所有異常設置不會因錯誤而中斷,也不會提供任何見解(可能是因爲它不是我的代碼?)。

正在使用EntityFrameworkCore.SQLServer 1.0.4。目前無法升級到較新版本,但在使用1.1.1時可成功運行。

使用SQL Server 2016 VS 2017

在複雜的IQueryable調用ToList時出現問題。

錯誤是如何解決的?有關如何繼續的建議?

+0

如果您在查看代碼時一無所知,我們該怎麼辦?另外,如果升級解決了問題,嘗試在較舊的(幾乎測試版)版本中嘗試並避開它是沒有意義的。 –

+0

在看到StackTrace之後,在實現值時發生關係修正時出現錯誤。這可能指向錯誤的模型,不一致的數據庫狀態或其他。沒有看到代碼和價值觀,就不可能提供解決方案。 – DevilSuichiro

回答

0

顯然,您嘗試將某個字符串強制轉換爲int。問題是你不知道在哪裏。

既然您發佈了這個標有實體框架的問題,我認爲問題出在這個領域。

如何診斷問題是?

某處你有一類來源於DbContextDBSet特性描述你的表:

class MyDbContext : DbContext 
{ 
    public DbSet<MyItem> MyItems {get; set;} 
    public DbSet<YourItem> YourItems {get; set;} 
} 

和提高你的例外的地方,你有你的困難LINQ查詢:

using (var myDbContext = new DbContext()) 
{ 
    var result = myDbContext.MyItems.SomeDififultLingQuery(); 
} 

哪裏SomeDifficultLinqQuery是一個Where,Select,GroupBy和許多其他擴展和`IQueryable。

要診斷問題的根源所在,將您DifficultLinqQuery成更小的步驟,並在調試器的每個結果檢查:

IQueryable<MyItem> result1 = myDbContext.MyItems; 
var result1List = result1.ToList(); 

IQueryable<MyItem> result2 = result2.Where(item => item.name = "Trump"); 
var result2List = result2.ToList(); 

var result3 = result2.GroupBy(item => item.Address) 
var result3List = result3.ToList(); 

var result4 = result3.Select(item => new 
{ 
    President = item.Name, 
    Tweet = ... 
}; 
var result4List = result4.ToList(); 

現在在調試器中,在第一步停止,每一步之後檢查結果。某處有一個字符串正在嘗試轉換爲int。你的調試器會告訴你什麼時候無法完成。

要將字符串轉換爲int32,請使用Int32.Parse。如果您的ling-to-sql提供程序不支持此操作,則必須儘可能長地保留字符串的字符串。就在轉換使用前AsEnumerable()

VAR resultX = ... //這一步是最後一個工程 VAR resultY = resultX.AsEnumerable() 。選擇(項目=>新 { 的intValue = Int32.Parse (item.StringValue), ... }

0

感謝您提供非常詳細和有見地的回覆。使用這些技術,雖然我不確定原因,但仍能夠識別和解決問題。

在我們的設計中 - 使用EF Core 1.0.4 table-per-hierarchy - 我們有一個LegalEntity類。業務和參與者繼承LegalEntity。實體可以有許多員工(參與者)。一個參與者可以有很多僱主(LegalEntities)。

爲了解決這個問題 - 在上下文類的 「OnModelCreating」 方法 - 添加流利語句:

modelBuilder.Entity() .HasMany(Z => z.Employees).WithOne()。 HasForeignKey(z => z.EmployerID);

modelBuilder.Entity() .HasMany(z => z.Employers).WithOne()。HasForeignKey(z => z.EmployeeID);

所以,流暢的語句,加上在LegalEntity定義的集合...

公共ICollection的員工{獲得;組; }

...加上在與會者中定義的集合:

公共ICollection的僱主{獲得;組; }

...導致4個外鍵被創建。

現在問題已解決。不要問我如何/爲什麼。

它還解決了以下錯誤:

無法轉換類型的對象「System.Boolean」爲類型「System.Int32」。

相關問題