【问题标题】:Entity Framework 4 ExecuteStoreQuery<T> -- unable to results to object-type propertyEntity Framework 4 ExecuteStoreQuery<T> - 无法生成对象类型属性
【发布时间】:2011-03-17 20:39:16
【问题描述】:

我有一个映射到表 EntityTable 的实体,它非常简单,由大约 4 或 5 个值类型属性组成。但是,根据我访问的数据库,其中一个属性的架构是不同的:在大多数架构中,它是 decimal,在少数其他架构中,它是 smallint(或 C# 中的 Int16) .显然,当 EF 尝试将 Int16 值映射到需要 decimal-typed 属性的实体时,这会使 EF 出错。

所以我的解决方法是在 EF 上下文中调用 ExecuteStoreQuery(),并让 FauxEntity 将不稳定的属性声明为 object,而不是明确地 decimalInt16。然后我可以专门手动处理属性的拆箱。

但是,这不起作用!属性的值是null,而不是对装箱Int16(或decimal 值)的对象引用!这很奇怪,因为我可以轻松地声明如下内容:

object intVal = 16;

intVal 然后将成为一个装箱的int 值的实例。然后我可以适当地拆箱。

这就是我对 ExecuteStoredProcedure 的期望——它应该将值放入对象属性中,然后我可以进行一系列拆箱测试以正确地拆箱该值。但是,该值永远不会成功地装箱到 object 属性中!

ExecuteStoreQuery&lt;T&gt;() 甚至可以做到这一点吗?为什么它不能将值类型加载到object-typed 属性中?

顺便说一句,我知道我可以通过针对 SQL 代码执行 DataReader 并手动转换每个结果列来解决手头的问题。我只是想知道为什么 ExecuteStoreQuery&lt;T&gt;() 的行为不如预期。

【问题讨论】:

    标签: c# .net entity-framework-4


    【解决方案1】:

    restrictions on TElement 在 MSDN 中。引用:

    对于前面采用通用结果类型参数的方法,TResult 可以是原始类型、实体类型或任何自定义类型。该类型不必在实体框架概念模型中定义。如果指定类型属于概念模型中未定义的类型或不是原始类型,则适用以下映射约定。

    类型:

    • 不得抽象。
    • 必须有一个默认构造函数。

    类型的每个属性:

    • 必须有二传手。
    • 必须对应于 CSDL 中的原始类型。
    • 必须与生成的 DbDataReader 中的列名相对应(提供程序实现确定列是否与属性同名)。如果类型属性的名称与 Db​​DataReader 的字段不匹配,则实体框架会具体化该属性的默认值(如果它是在概念模型中定义的)。

    【讨论】:

    • 所以看起来属性要求的第二个子弹是让我绊倒的地方。 object 肯定不是原始类型。唉。感谢 Craig 在 MSDN 中进行挖掘,我显然错过了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-25
    • 2012-08-12
    • 1970-01-01
    • 2011-11-16
    • 2017-05-29
    相关资源
    最近更新 更多