在属性中编码第一个存储功能

时间:2016-12-20 18:52:09

标签: c# entity-framework linq code-first

我在尝试将数据库中的字符串列映射到应用程序中的整数时遇到了麻烦。

我有一个包含车辆集合的数据库,在创建表格时,年份列被指定为varchar。我需要将值作为整数来执行计算。

我知道我可以使用int.Parse来转换它,但我需要它在实体框架查询中工作。 linq to entity不支持int.Parse,因此该方法已经用完了。

我尝试的下一件事是创建一个视图并将列转换为int。这非常有效,直到我需要写入数据库,然后抛出错误,因为视图包含派生字段。

我接下来尝试使用Pawel Kadluczka的“EntityFramework.CodeFirstStoreFunctions”库。这确实有效,但只有当我直接指定它时才会这样:

sig_atomic_t

其中ParseInt在c#中定义为

Store.Vehicles.Where(x => CustomSqlFunctions.ParseInt(x.ModelYear) == 2000)

sql中的ParseInt函数只调用[CodeFirstDbFunction("ParseInt")] public static int ParseInt(string number) { throw new NotSupportedException("Direct calls are not supported."); } ,其中@ p1是传入的字符串。

我的问题是:
是否可以从Vehicle类的属性中调用cast( @p1 as int)

我试过这个:

CustomSqlFunctions.ParseInt(ModelYear)

但是我收到LINQ to Entities

中不支持Year的错误

2 个答案:

答案 0 :(得分:0)

我假设Year未映射到数据库。在这种情况下,您可以执行等效的“强制转换”:

get
{
    int value;
    return int.TryParse(ModelYear, out value) ? value : null;
}

答案 1 :(得分:0)

我最终弄明白了。这是一个相当简单的解决方案。我使用计算列返回自定义视图。然而,这一次,我保留了被称为“ModelYear”的原始字段。并添加了专栏' Year'这将是从字符串到int的转换。

年度财产最终看起来像这样:

[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public int? Year {
    get { return _year; }
    set {
        _year = value;
        ModelYear = value.ToString();
    }
}

当一个值设置为Year时,它也会被设置为ModelYear作为字符串。当模型保存到数据库时,ModelYear字段会更新,并且因为Year字段被标记为computed,所以框架也不会尝试保存字段。

作为附注,年份实际上并没有被称为开始。在单步执行Entity框架的源代码后,我发现在计算表达式之前,它首先检查被调用属性是否实际上是数据库中的映射成员。由于未映射Year,因此甚至不评估包含Year的表达式。