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

或者我应该使用无参数方法(不确定有什么缺点)

一般来说(不考虑 EF),当功能等效时,上面考虑哪种方法是首选的(即,如果我调用.IsRoot或,我会得到相同的功能.IsRoot()

4

3 回答 3

2

IsRoot对我来说更像是一种财产。它表示对象的当前状态,在调用时除了报告该状态之外实际上不做任何事情,并且通常 .NET 中的 getter/setter 是属性。

还有其他需要考虑的事情,JSON/XML 序列化程序不会序列化IsRoot(),而是IsRoot作为属性。一般来说,.NET 中的很多东西都依赖于属性,所以它们通常是更好的选择。

EF 也不喜欢IsRoot(),它只是不知道如何将 IsRoot 转换为 SQL,无论是属性还是方法。

于 2012-07-20T18:28:55.407 回答
0

您是否已经尝试过IsRoot使用[NotMapped]进行装饰?NotMapped 属性应防止实体框架抱怨它无法持久的属性,并允许您将其表达为属性。

于 2012-07-20T18:39:50.907 回答
0

通常(如您所说,不考虑 EF 的限制),在这种特定上下文中域模型的方法可能是只读属性。

考虑到该属性只是检查状态,而不是以任何方式修改它。只读属性在对象之外传达它只是返回一条信息。另一方面,一种方法可能具有潜在的破坏性,因为它可能会修改信息。

如果方法当然返回,这将尤其如此void,这里不是这种情况,所以这可以被认为是一个边界问题(甚至不是没有“属性”但只使用访问器方法的语言中的问题,这在引擎盖下是“属性”所做的)。

我的投票是检查状态时的属性和命令对象修改状态时的方法。

于 2012-07-20T18:29:21.553 回答