在EF 6

时间:2015-10-02 10:05:05

标签: c# sql-server entity-framework

我有一个没有约束的数据库(给定,不可更改)。我的模型看起来像

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和Code之间的自动映射。

更新 看来我不够具体。我需要3行AS WELL作为错误的通知。

另外,我为demo创建了一个简单的案例。在现实生活中,我有大约800个表,最多250列。我不能通过模型​​修改来捕捉任何东西,例如日期超出范围,缺少关系和其他东西。

我真正需要的是每行的try..catch或行读取失败的事件,就像这样。

4 个答案:

答案 0 :(得分:1)

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

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;

答案 1 :(得分:0)

您需要使用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; }
}

此外,在您的选择查询中,您应该排除Value = null

var myModel = models.Where(x => x.Value != null);

希望它有所帮助。

答案 2 :(得分:0)

使用以下代码:

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

&#34;捕捉&#34;有多种选择。错误

如果你想抛出异常,请使用:

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

答案 3 :(得分:0)

我不完全确定我理解您要做的事情,但如果您想要反映表中的内容,那么为什么不让您的模型与查询匹配?如果Value可以是NULL,那么请Value为可空(即将其定义为long?)。

这样,您可以简单地执行:

var records = DbContext.MyModel.ToList();

如果您想要过滤掉NULL,可以执行以下操作:

records.Where(r => r.Value.HasValue)

如果您想要NULL s的那些,您可以这样做:

records.Where(r => !r.Value.HasValue)

或者,如果您想知道任何行是否有NULL,您可以这样做:

records.Any(r => !r.Value.HasValue)