5

私はEF4.3を介した単一テーブル継承を利用するいくつかのコードに取り組んでいます。

UserというエンティティとAdminという別のエンティティがあります。管理者はユーザーから継承します。

ユーザークラス

public class User
{
    public int Id {get;set;}
    public string Username {get;set;}
}

管理者クラス

public class Admin : User { }

DiscriminatorEFは、列を持つデータベーステーブルを生成しました。Adminレコードが追加されるDiscriminator="Admin"と、ユーザーレコードには。が含まれますDiscriminator="User"

私の質問は、にしたい場合、どのように列を更新するのですDiscriminatorか?UserAdmin

あるオブジェクトタイプから別のオブジェクトタイプにキャストし、EFを使用して保存してみました。ただし、Discriminator列は変更されません。どうすれば変更できますか?

助けてくれてありがとう。

4

1 に答える 1

7

オブジェクトはその型を変更することはできません。ユーザーの「管理者」設定を変更する場合 (合理的)、タイプ名ではなく、属性/プロパティを使用して変更する必要があります。

たとえば、オブジェクトをサブタイプに置き換えるのではなくUser、オブジェクトとオブジェクトを関連付けることができます。AdministratorUserAdministrator

このアイデアについては、古いブログ投稿で次のように書きました。

優れたオブジェクト リレーショナル マッピングを設計する際に克服しなければならない精神的な障壁の 1 つは、主にオブジェクト指向の用語またはリレーショナルの用語のうち、自分の性格に合った用語で考える傾向があることです。ただし、優れたオブジェクト リレーショナル マッピングには、優れたオブジェクト モデルと優れたリレーショナル モデルの両方が組み込まれています。たとえば、People 用のテーブルと、Employees および Customers 用の関連テーブルを含むデータベースがあるとします。1 人の人物が 3 つのテーブルすべてにレコードを持っている場合があります。ここで、厳密なリレーショナルの観点から、従業員用のデータベース VIEW と顧客用のデータベース VIEW を構築できます。どちらも People テーブルの情報を組み込んでいます。いずれかのビューを使用する場合、個人を一時的に「ただの」従業員または「ただの」顧客と考えることができます。両方だとわかっていても。したがって、この世界観から来た人は、Employee と Customer が両方とも Person の (直接の) サブクラスである OO マッピングを実行したくなるかもしれません。しかし、これは私たちが持っているデータでは機能しません。1 人の人物が従業員と顧客の両方のレコードを持っているため (また、具体的なサブタイプ Employee と Customer を同時に持つことができる Person インスタンスがないため)、Person と Employee の間の OO 関係は、継承ではなく合成である必要があり、Person と Customer についても同様です。

質問に直接答えるために、EF を使用してこの列を変更する方法はありません。もちろん、ストレート SQL で実行することもできます。しかし、上記の理由から、このデザインを変更することをお勧めします。

于 2012-05-23T21:37:13.820 に答える