11

共通のインターフェイスを共有し、両方とも同じ基礎となるデータベース テーブルに格納されている 2 つの関連するクラスがあります。ただし、Entity Framework は 1 つの共通クラスを生成します。この 2 つの異なるクラスが本当に必要です。これを解決するにはどうすればよいですか? インターフェイスではなく基本クラスを使用するのが最善ですか? 1 つのテーブルにマップされた 2 つのクラスを提供するように EF モデルを変更するにはどうすればよいですか?

編集: AccountType プロパティはクラスのタイプを決定します。ユーザーまたはグループ。

簡単なコード:

public interface IAccount
{
    string Name { get; set; }
    AccountType AccountType { get; set; }
}

public class GroupAccount : IAccount
{
    public string Name { get; set; }
    public GroupType GroupType { get; set; }
    public AccountType AccountType { get; set; }
}

public class UserAccount : IAccount
{
    public string Username { get; set; }
    public string Password { get; set; }
    public string Name { get; set; }
    public AccountType AccountType { get; set; }
}
4

1 に答える 1

14

このデータは差別化されていますか?つまり、 AccountType はそれがどのタイプであるかを定義しますか? もしそうなら:

  • EF は、ストレージから Account エンティティを作成する必要があります
  • 次に、2 つのサブクラス (UserAccount と GroupAccount) を作成します。
  • アカウントのマッピングで、述語「条件を追加」を指定します
    • AccountType (ストレージ) フィールドが 1 (または何でも) である UserAccount にマップします。
    • AccountType (ストレージ) フィールドが 2 (または何でも) である GroupAccount にマップします。

その後、アカウント タイプは Account オブジェクトから完全に消えます (そうでない場合はマップ解除します)。UserAccount レコードだけを取得するには、次を使用します

 .Accounts.OfType<UserAccount>()...

Account クラスは、このモデルではおそらく抽象化する必要があります。インターフェイスのものは、部分クラスを介して追加できます-つまり、別のファイルで定義します。

partial class Account : IAccount {
   // extra code here
}

妥当なウォークスルーはこちらです。

于 2008-12-09T16:09:32.697 に答える