2017-01-21 8 views
0

EntityFramework, первое решение кода.Как добавить элемент в репозиторий без загрузки родительских и дочерних элементов элемента в память

Мой 'вместилище'

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

Account является

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

Как я могу добавить новый User к Account, используя Linq-To-Entities, без загрузки всего Account объекта, или по крайней мере, без загрузки всего набора Users.

Я обычно делаю это так:

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

, но я заметил, что это загружает весь набор в память, которую я хочу, чтобы избежать.

Возможно ли это? Какие у меня варианты? Я могу думать: Экспозиция Users в DbContext и добавьте пользователя оттуда. Но это вызовет для меня все другие проблемы.

Любые другие варианты?

+1

Ваш контекст, очевидно, знает 'User' как отображаемый класс. Я не понимаю, с какими * проблемами * вы столкнулись, добавив к нему IDbSet . Самый простой способ - добавить пользователей и установить их 'AccountId', если у них есть это свойство. –

+0

@GertArnold, ну, например, свойство 'AccountId' имеет частный сеттер, и я хочу, чтобы он остался таким. –

ответ

1

Если вы знаете значение И.Д. Account «s, вы можете создать незавершенная объект и добавьте User его Users коллекции:

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

С Account.Users имеет частный сеттер, я предполагаю, что вы инициализации сбор в конструкторе.

+0

Я действительно собираюсь с вашим другим решением (я сделал установщика 'AccountId'' internal'), но у меня проблема. «AccountId» - это только половина составного ключа, другая половина - «DatabaseGeneratedOption.Identity». Теперь, когда я устанавливаю 'AccountId', я получаю значение внешнего ключа не может быть вставлено, потому что соответствующее значение первичного ключа не существует_ error. –