4

我的用例非常简单。我有一个小桌子,里面有一列像这样:

dtgTestValue sql_variant not null

我创建了一个实体框架模型(.edmx 文件),它跳过了该列说:

不支持数据类型“sql_variant”;表 'databaseFoo.dbo.Foobar' 中的列 'dtgTestValue' 被排除在外。

我需要能够在此特定列中读取和写入值。关于如何处理这个相当简单的用例有什么建议吗?

4

2 回答 2

4

EF 4 没有对类型的内置支持sql_variant本文解释了如何通过将实体映射到自定义查询,分别捕获类型和值,然后在代码中手动解码值来进行读取。

不幸的是,这个解决方案不能适用于写回数据。您可以尝试将插入/更新/删除映射到存储过程,但我不能确定它会起作用,因为我从未尝试过。

于 2012-06-26T02:56:36.483 回答
2

聚会有点晚了,但还有另一种方法可以做到这一点,可以为您存储在数据库表中的每个变体“类型”创建一个单独的 LINQ 表类。这允许您执行插入操作。例如;

[Table(Name = "tVariant")]
public class tVariantDouble
{
    [Column(IsPrimaryKey = true, IsDbGenerated = true)]
    public int variantID { get; set; }

    [Column(CanBeNull = true)]
    public double? myVariant { get; set; }

    [Column(CanBeNull = true)]
    public string name { get; set; }

    [Column(CanBeNull = false)]
    public int typeID { get; set; }

    public tVariantDouble() { typeID = 1; }
};

[Table(Name = "tVariant")]
public class tVariantInteger
{
    [Column(IsPrimaryKey = true, IsDbGenerated = true)]
    public int variantID { get; set; }

    [Column(CanBeNull = true)]
    public int? myVariant { get; set; }

    [Column(CanBeNull = true)]
    public string name { get; set; }

    [Column(CanBeNull = false)]
    public int typeID { get; set; }

    public tVariantInteger() { typeID = 2; }
};

然后,这些类允许您插入传统的 LINQ-to-SQL 方法。我还在插入期间将 typeID 设置为唯一值,这对于使用 LINQ where 语句再次选择适当类型的数据很有用。

我建议为同一个表创建一个基本模板类,但是 LINQ 在继承方面充其量是笨重的,它根本不起作用。

这种方法确实会造成一些重复,但仍然是一种非常巧妙的方法,与其他建议的方法相比,缺点更少。

如果您想从表中选择所有数据,无论变体类型如何,我建议使用带有单独中间类的联合运算符来连接所有结果。

于 2013-09-18T14:18:34.240 回答