3

EFを使用してコーディングしたい既存のデータベース(変更することはできません)があります。主キー、外部キー、またはテーブル間の実際の関係はありません。すべてがDBを使用するアプリケーションによって処理されるようです。ほとんどのテーブル/エンティティにとって、これは些細なことです。しかし、私が苦労している以下のような(簡略化された)クラスが1つあります。

[Table("tableName")]
public class MyClass
{
    [Key]
    [Column("id")]
    public int? Id { get; set; }

    [Column("name")]
    public string CompanyName { get; set; }

    [Column("address")]
    public string Address { get; set; }
}

_context.MyClasses.Where(x => x.Address == "something")うまくいくようなもの。ただし、DBでid列がNULLの場合、CompanyNameとAddressに値がある場合でも、nullオブジェクトが返されるようです。そして、id(または他のもの)がnullであるかどうかに関係なく、これらの値が必要です。EFにオブジェクトを生成させ、空の列を無視させる方法はありますか?

[Key]属性を削除または移動すると、「キー列が必要」などの例外が発生します(Id-columnは、他のクラスのコレクションをこのクラスにマップするためにも使用されます)。

更新Id列を実際の識別子とは考えないでください。それは基本的には愚かな名前の整数です。

4

4 に答える 4

3

データベースで null 可能である場合、Id プロパティの上に KeyAttribute を配置することはできません。それがあなたに問題を引き起こしているのです...

主キーを null 許容にすることはできませんが、ご存知だと思います...

于 2012-07-06T09:08:29.970 に答える
2

これが機能するには、列が必要Keyであり、その列に値が含まれている必要があります。列を としてマークするKeyと、これがそのテーブルの主キー列であることを示します。

列に null 値が含まれている場合Key、その行はクライアントに返されません。列が主キーでない場合Id(null 値を含むことができるため)、主キーとして機能する新しい列を追加する必要があります。

于 2012-07-06T09:08:46.507 に答える
1

ソリューション

Andreas Niedermair が私の質問にコメントしたように、データベースの複数の列に [Key] を追加しました。この場合、4 つの列を組み合わせた複合キーは常に一意であることがわかりました。

データベースに新しいコンテンツを挿入することはないので、このエッジ ケース シナリオでは適切なソリューションのように思えます。

于 2012-07-06T10:59:37.877 に答える
1

キー列が必要です。EF では、1 つ持っている必要があります。ただし、目的のために、別の方法を使用できます。

Id の StoreGeneratedPattern プロパティを Identity として設定し、その生成と管理を EF に任せます。null 許容の目的で Id を使用しないでください。Nullable で EntityKey ではない MyId のような別の列を作成し、任意の方法で使用します。

于 2012-07-06T09:14:33.790 に答える