捕获ef6上的读错误
本文关键字:错误 ef6 捕获 | 更新日期: 2023-09-27 18:15:44
我有一个没有约束的数据库(给定的,不可更改的)。我的模型看起来像
public MyModel
{
public long Id { get; set; }
// Even if database column 'Value' could be NULL,
// the model - from business view - could not.
public long Value { get; set; }
}
我想要读取的数据是
Id Value
1 1
2 2
3 NULL
4 4
当我用DBContext.MyModel.ToList()读取时,它当然失败了。是否有可能捕获第3行错误并返回3个有效的错误?
我不依赖EF,但我喜欢DB和代码之间的自动映射。
更新:看来我说得不够具体。我需要3行以及错误的通知。
我已经为demo创建了一个简单的案例。在现实生活中,我有大约800个表,最多250列。我无法通过模型修改捕捉到任何东西,比如超出范围的日期、缺失的关系和其他东西。我真正需要的是每一行的try. catch或行读取失败的事件,就像这样
好的,解决了。不是很优雅,但是很实用。
var query = _DBContext
.Database
.SqlQuery<MyModel>("SELECT * FROM MyModel");
var result = new List<MyModel>();
var enumerator = query.GetEnumerator();
while (true)
{
try
{
var success = enumerator.MoveNext();
if (!success)
break;
var model = enumerator.Current;
result.Add(model);
}
catch (Exception ex)
{
}
}
return result;
您需要使用nullable type
public MyModel
{
public long Id { get; set; }
// Even if database column 'Value' could be NULL,
// the model - from business view - could not.
public long? Value { get; set; }
}
同时,在select查询中,应该排除Value = null
var myModel = models.Where(x => x.Value != null);
希望能有所帮助。
我不完全确定我理解你想做什么,但如果你想得到什么表中的反射,那么为什么不让你的模型匹配查询?如果Value
可以是NULL
,则使Value
为空(即定义为long?
)。
这样,您可以简单地执行:
var records = DbContext.MyModel.ToList();
如果你想过滤掉NULL
s,你可以这样做:
records.Where(r => r.Value.HasValue)
如果你想要有NULL
s的,你可以:
records.Where(r => !r.Value.HasValue)
或者如果你想知道任何行是否有NULL
,你可以这样做:
records.Any(r => !r.Value.HasValue)
使用以下代码:
var list = from m in DBContext.MyModel
where (m != null)
select m;
然后将var list转换为您选择的list。
编辑1
var myModel = models.Where(x => x.Value != null).ToList();
正如kienct89建议的那样,也可以工作。
编辑2
有多个选项可以"捕捉"错误
如果你想抛出一个异常,只需使用this:
if(myList.Count() < DBContext.MyModel.Count()){
Exception myException = new Exception("Not all items ware correctly loaded");
throw myException;
}
或者用故障数组创建一个单独的数组:
var faultyList = from m in DBContext.MyModel
where (m == null)
select m;
或:
var faultyList= models.Where(x => x.Value == null).ToList();