【问题标题】:Code first Store Functions in a Property代码优先将函数存储在属性中
【发布时间】:2017-05-06 01:56:47
【问题描述】:

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

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

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

接下来我尝试创建一个视图并将列转换为 int。这非常有效,直到我需要写入数据库,然后由于视图包含派生字段而引发错误。

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

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

其中 ParseInt 在 c# 中定义为

[CodeFirstDbFunction("ParseInt")]
public static int ParseInt(string number) {
    throw new NotSupportedException("Direct calls are not supported.");
}

sql 中的 ParseInt 函数只是调用cast( @p1 as int) 其中@p1 是传入的字符串。

我的问题是:
是否可以从 Vehicle 类的属性中调用 CustomSqlFunctions.ParseInt(ModelYear)?。

我试过这个:

public int? Year {
    get { return CustomSqlFunctions.ParseInt(ModelYear); }
    set { ModelYear = value.ToString(); }
}

但我收到错误,即 LINQ to Entities 不支持年份

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 不幸的是,这在我的情况下不起作用,因为 int.Parse(和 int.TryParse)无法转换为要在 Linq to Entities 中使用的 sql 函数。
    【解决方案2】:

    我终于明白了。这是一个相当简单的解决方案。我回到带有计算列的自定义视图。然而,这一次,我保留了名为“ModelYear”的原始字段,并添加了“Year”列,该列将从字符串转换为 int。

    year 属性最终看起来像这样:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-31
      • 1970-01-01
      • 2012-12-17
      • 1970-01-01
      相关资源
      最近更新 更多