gpt4 book ai didi

c# - Entity Framework : read only property vs parameter-less method

转载 作者:太空宇宙 更新时间:2023-11-03 11:19:13 24 4
gpt4 key购买 nike

考虑下课

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(),我将获得相同的功能),首选哪种方法

最佳答案

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

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

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

关于c# - Entity Framework : read only property vs parameter-less method,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11584938/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com