【发布时间】:2015-11-16 22:12:43
【问题描述】:
我有一个简单的网络应用程序,它允许用户上传 2 个包含某些数据的 .csv 文件。为了持久化数据,我在两个不同的Import-methods 中使用了Entity Framework。
第一个导入方法
public void ImportOne(string path)
{
StreamReader sr = new StreamReader(path);
using (var db = new ContextEv("RndContext"))
{
db.Database.ExecuteSqlCommand("DELETE FROM TableA");
db.Database.ExecuteSqlCommand("DELETE FROM TableB");
while (!sr.EndOfStream)
{
string[] data = sr.ReadLine().Split(';');
string houseId = data[0];
House house = new House()
{
HouseId = houseId,
};
House dummy = db.Houses.Find(houseId);
if (!dummy.HouseId.Equals(house.HouseId))
{
db.Houses.Add(house);
}
}
}
}
}
此行失败:House dummy = db.Houses.Find(houseId);,但有以下异常:
其中一个主键值的类型与类型不匹配 在实体中定义。请参阅内部异常 详细信息。\r\n参数名称:keyValues
InnerException 的ErrorContext:
关键字“AS”,第 1 行,第 22 列
InnerException 的错误描述:
查询语法无效。
好的,我检查了类型是否真的是这里的问题。不过我没发现有什么不对。
关于它的“有趣”之处在于,我在另一个 Import 方法中使用了相同的 Find 方法,并且它毫无例外地工作!
using (var db = new ContextEv("RndContext"))
{
db.Database.ExecuteSqlCommand("DELETE FROM TableC");
db.Database.ExecuteSqlCommand("DELETE FROM TableD");
StreamReader sr = new StreamReader(path);
while (!sr.EndOfStream)
{
string[] data = sr.ReadLine().Split(';');
string houseId = data[5];
House house = db.Houses.Find(houseId);
...
...
db.SaveChanges();
}
}
我不确定您真正需要哪个代码来回答我的问题,但如果有人要求提供特定代码,我很乐意发布更多信息。
更新 1 对 user89861 的回答
'db.Houses.ToList().Find(h => h.HouseId == houseId)' 抛出一个 'System.NullReferenceException' 类型的异常
" 贝 System.Data.Entity.Internal.Linq.InternalQuery
1.GetEnumerator()\r\n1.GetEnumerator()\r\n 北 System.Data.Entity.Infrastructure.DbQuery
bei System.Data.Entity.Internal.Linq.InternalSet1.System.Collections.Generic.IEnumerable<TResult>.GetEnumerator()\r\n bei System.Collections.Generic.List1..ctor(IEnumerable1 collection)\r\n bei System.Linq.Enumerable.ToList[TSource](IEnumerable1 source)"
【问题讨论】:
-
houseId的值是多少?是你所期望的吗? -
因为
Find()接受object key作为参数,你可以向它传递任何东西,但首先你必须确保主键的类型确实与你的参数类型相同.您是否尝试过先将houseId转换为int(假设您的主键是int)? -
HouseId 是 nvarchar(128) 并且从 .csv 返回一个字符串。所以我认为数据类型是正确的。如前所述,在一种方法中它可以在另一种方法中运行,但它不能......而且它是同一行代码。
-
@David 但是当您单步执行代码时它是否具有实际值?它可能是空/空
-
复制过去有问题的行
line 1, column 22
标签: c# .net asp.net-mvc entity-framework linq