4

私のユースケースはとてもシンプルです。次のような列を持つ小さなテーブルがあります。

dtgTestValue sql_variant not null

Entity Framework モデル (.edmx ファイル) を作成しましたが、その列は次のようにスキップされました。

データ型 'sql_variant' はサポートされていません。テーブル「databaseFoo.dbo.Foobar」の列「dtgTestValue」が除外されました。

この特定の列に値を読み書きできる必要があります。このかなり単純なユースケースにアプローチする方法について何か提案はありますか?

4

2 に答える 2

4

EF 4 には型のサポートが組み込まれていませんsql_variantこの記事では、エンティティをカスタム クエリにマッピングし、型と値を個別にキャプチャしてから、コード内で値を手動でデコードすることで読み取りを行う方法について説明します。

残念ながら、このソリューションはデータの書き戻しには適応できません。inserts/updates/deletes をストアド プロシージャにマッピングしてみることができますが、試したことがないため、確実に機能するとは言えません。

于 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 に答える