2

次のクラスを検討してください

public class AccountGroup : Entity<int>
{
    public AccountGroup()
    {
        Accounts = new HashSet<Account>();
        Groups = new HashSet<AccountGroup>();
    }

    // option 1 - read only properties
    public bool IsRoot { get { return Parent == null; } }
    public bool IsLeaf { get { return !Groups.Any(); } }
    public Account MainAccount { get { return Accounts.FirstOrDefault(a=>a.Type == AccountType.MainAccount); } }

    // option 2 - parameter-less methods
    //public bool IsRoot() { return Parent == null; }
    //public bool IsLeaf() { return !Groups.Any();  }
    //public Account GetMainAccount() { return Accounts.FirstOrDefault(a => a.Type == AccountType.MainAccount); }

    public string Name { get; set; }
    public string Description { get; set; }

    public virtual ISet<Account> Accounts { get; private set; }
    public virtual ISet<AccountGroup> Groups { get; private set; }
    public virtual AccountGroup Parent { get; set; }
}

上記のクラスを「充実」させたい場合は、どのオプションアプローチを使用する必要があります。

オプション1

EFがそれらを好まないことを知っている読み取り専用パラメーターを使用する必要があります(Where句でIsRootを使用しようとすると、exがスローされます。The specified type member 'IsRoot' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported.

オプション2

または、パラメータなしの方法を使用する必要があります(何が不利になるかわからない)

.IsRoot一般に(EFを考慮しない)、機能が同等である場合(つまり、またはを呼び出すと同じ機能が得られる場合)、上記を考慮してどちらのアプローチが推奨されますか.IsRoot()

4

3 に答える 3

2

IsRoot私にとっては財産のように感じます。これはオブジェクトの現在の状態を表し、呼び出されたときにその状態を報告する以外は実際には何もしません。通常、.NETのゲッター/セッターはプロパティです。

考慮すべき点は他にもあります。JSON/XMLシリアライザーはシリアル化されませんIsRoot()IsRoot、プロパティとして使用されます。一般的に言えば、.NETの多くのことはプロパティに依存しているため、多くの場合、それらがより適切な選択です。

EFはIsRoot()どちらも気に入らないでしょう。それがプロパティであるかメソッドであるかにかかわらず、IsRootをSQLに変換する方法を知らないだけです。

于 2012-07-20T18:28:55.407 に答える
0

一般に(あなたが言うように、EFの制限を考慮に入れていない)、この特定のコンテキストでのドメインモデルのアプローチは、おそらく読み取り専用のプロパティになります。

プロパティは単に状態をチェックしているだけであり、決して変更していないと考えてください。読み取り専用プロパティは、オブジェクトの外部で、情報の一部を返しているだけであることを伝えます。一方、メソッドは、情報を変更する可能性があるという点で、潜在的に破壊的である可能性があります。

もちろん、メソッドが返された場合、これは特に当てはまりますが、voidここではそうではありません。したがって、これは境界の問題と見なすことができます(「プロパティ」を持たず、アクセサメソッドを使用するだけの言語の質問でもありません。これは、「プロパティ」が行うことです)。

私の投票は、状態をチェックするときのプロパティと、オブジェクトに状態を変更するように命令するときのメソッドです。

于 2012-07-20T18:29:21.553 に答える
0

[NotMapped]でデコレーションIsRootしてみましたか?NotMapped属性は、Entity Frameworkが永続化できないプロパティについて文句を言うのを防ぎ、それをプロパティとして表現できるようにする必要があります。

于 2012-07-20T18:39:50.907 に答える