2017-01-21 4 views
0

EntityFramework、コードの最初の解決策。アイテムの親と兄弟をメモリにロードせずにリポジトリにアイテムを追加する方法

私の 'リポジトリ'

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

Accountが、私はLINQのツーエンティティ、全体Accountオブジェクトをロードせずに使用して、Accountに新しいUserを追加することができますどのように

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

ですか少なくともUsersの全部を読み込まずに。

私は通常のようにそれを行う:

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

が、私はこれは私が避けたいメモリにセット全体をロードすることに気付きました。

可能ですか?私の選択肢は何ですか?私は考えることができます: UsersDbContextに公開し、そこからユーザーを追加します。しかし、これは私のために他のすべての種類の問題を引き起こすでしょう。

他のオプションはありますか?

+1

あなたのコンテキストは明らかにマップされたクラスとして 'User'を知っています。 'IDbSet 'を追加することで、あなたが直面する問題*の種類を理解できません。最も簡単な方法は、ユーザーを追加して、そのプロパティを持っている場合は、 'AccountId'を設定することです。 –

+0

@GertArnold、まあ、1つのために、 'AccountId'プロパティはプライベートセッターを持っていて、私はそれをそのままにしておきたいと思います。 –

答えて

1

あなたはAccountのid値を知っている場合、あなたはスタブエンティティを作成し、そのUsersコレクションにUserを追加することができます。

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'を設定すると、対応するプライマリキー値が存在しないため、外部キー値を挿入できません_エラーです。 –

関連する問題