C# 如何在不加载项目的情况下将项目添加到存储库';将父母和兄弟姐妹放入内存

C# 如何在不加载项目的情况下将项目添加到存储库';将父母和兄弟姐妹放入内存,c#,entity-framework,linq,linq-to-sql,linq-to-entities,C#,Entity Framework,Linq,Linq To Sql,Linq To Entities,EntityFramework,代码优先解决方案 我的“存储库” public abstract class BaseEfDataRepository : DbContext { public IDbSet<Account> Accounts { get; set; } } 如何使用Linq to Entities将新的用户添加到帐户,而无需加载整个帐户对象,或者至少无需从中加载整个用户集 我通常是这样做的: var account = context.Accounts.F

EntityFramework,代码优先解决方案

我的“存储库”

public abstract class BaseEfDataRepository : DbContext
{
    public IDbSet<Account> Accounts { get; set; }
}
如何使用Linq to Entities将新的
用户
添加到
帐户
,而无需加载整个
帐户
对象,或者至少无需从中加载整个
用户集

我通常是这样做的:

var account = context.Accounts.FirstOrDefault(acc => acc.Id == accountId);
account.Users.Add(newUser);
context.Save();
但我注意到这会将整个集合加载到内存中,这是我想要避免的

可能吗?我有什么选择?我能想到: 在
DbContext
中公开
用户
,并从中添加用户。但这会给我带来其他的问题


任何其他选项?

如果您知道
帐户的id值,您可以创建存根实体并将
用户添加到其
用户
集合:

var acc = new Account { Id = accountId };
context.Accounts.Attach(acc);
acc.Users.Add(newUser);
context.SaveChanges();

由于
Account.Users
有一个私有setter,我假设您在构造函数中初始化集合。

您的上下文显然知道
User
是一个映射类。我不明白添加
IDbSet
会遇到什么样的问题。最简单的方法是添加用户并设置他们的
AccountId
s(如果他们拥有该属性)。@GertArnold,好吧,首先,
AccountId
属性有一个私有setter,我希望它保持这种状态。我实际上会使用您的另一个解决方案(我制作了
AccountId
内部
的setter),但我有个问题。
AccountId
只是复合键的一半,另一半是
DatabaseGeneratedOption.Identity
。现在,当我设置
AccountId
时,由于相应的主键值不存在,因此无法插入外键值。
var acc = new Account { Id = accountId };
context.Accounts.Attach(acc);
acc.Users.Add(newUser);
context.SaveChanges();