【问题标题】:How to add an item to the repository without loading the item's Parent and siblings into memory如何在不将项目的父级和兄弟级加载到内存的情况下将项目添加到存储库
【发布时间】:2017-01-21 16:59:24
【问题描述】:

EntityFramework,代码优先解决方案。

我的“存储库”

public abstract class BaseEfDataRepository : DbContext
{
    public IDbSet<Account> Accounts { get; set; }
}

Account

public virtual List<User> Users { get; private set; }

如何使用 Linq-To-Entities 将新的 User 添加到 Account,而不加载整个 Account 对象,或者至少不加载整个 Users 对象集。

我通常这样做:

var account = context.Accounts.FirstOrDefault(acc => acc.Id == accountId);
account.Users.Add(newUser);
context.Save();

但我注意到这会将整个集合加载到内存中,我想避免这种情况。

有可能吗?我有哪些选择?我能想到: 在DbContext 中公开Users 并从那里添加用户。但这会给我带来所有其他类型的问题。

还有其他选择吗?

【问题讨论】:

  • 您的上下文显然知道User 是一个映射类。我不明白添加IDbSet&lt;User&gt; 会遇到什么问题。最简单的方法是添加用户并设置他们的AccountIds(如果他们有该属性)。
  • @GertArnold,首先,AccountId 属性有一个私有设置器,我希望它保持这种状态。

标签: c# entity-framework linq linq-to-sql linq-to-entities


【解决方案1】:

如果您知道Account 的id 值,您可以创建一个存根实体并将User 添加到它的Users 集合中:

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

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

【讨论】:

  • 我实际上正在使用您的其他解决方案(我制作了 AccountId internal 的设置器),但我遇到了问题。 AccountId 只是组合键的一半,另一半是DatabaseGeneratedOption.Identity。现在,当我设置 AccountId 时,我得到 A foreign key value cannot be insert because a specific primary key value does not exist 错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-23
  • 2014-01-07
  • 2016-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多