捕获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或行读取失败的事件,就像这样

捕获ef6上的读错误

好的,解决了。不是很优雅,但是很实用。

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();