C# 如何在不加载项目的情况下将项目添加到存储库';将父母和兄弟姐妹放入内存
EntityFramework,代码优先解决方案 我的“存储库”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
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();