2017-06-13 66 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”。

相关问题