2011-07-14 6 views
5

私はこのコード(EF 4とVS2010 ASP.NET MVC 3)を有する:それは、次のエラー( "project.ProjectUsers.Add(projectUser)" 線上)Entity Framework: "2つのオブジェクトの関係は、異なるObjectContextオブジェクトに関連付けられているため、定義できません。

"を生成

Project project = new Project(); 
project.Number = number; 
project.Name = name; 
context.AddObject(project); 

ProjectUser projectUser = new ProjectUser(); 
projectUser.User = user; 
projectUser.Status = 1; 
project.ProjectUsers.Add(projectUser); 

context.SaveChanges(true); 

を2つのオブジェクトの関係は、異なるObjectContextオブジェクトに関連付けられているため、定義できません。

私が知る限り、両方のオブジェクトが同じObjectContextを使用している理由はわかりません(しかし、私はEFを初めて使用しています)。

私は間違っていますか? ご協力いただきありがとうございます!

答えて

7

あなたuser変数は、エンティティタイプであり、それが別のコンテキストに割り当てられている場合は、この問題が発生したと思います。

私はこの問題は、あなたのProjectUserオブジェクトが明示的にコンテキストに割り当てられていないという理由だけで、あなたのProjectProjectUserオブジェクトの間にあるとは思わない - 私はあなたが行くとき、デフォルトでは、それはProjectと同じコンテキストに行こうと思いますそれを保存する。

本当に2つのコンテキストがあり、それらを一緒に結合しようとした場合にのみ、このエラーが発生すると思います。

+0

あなたはそうです!私は問題がProjectとProjectUserの間にあると思ったが、問題は確かにUserである。どうもありがとう! – Canam

+0

うれしい私は助けることができます。 –

4

Projectで行ったことだけをリストにして、ProjectUserをコンテキストに追加する必要があります。だから、ライン模倣:

context.AddObject(project); 

をし、代わりにそれ

context.AddObject(projectUser); 

作成し、プロジェクトにコレクションに追加する前にそれを行います。

+1

私は試みましたが、「一時的なEntityKey値を持つオブジェクトをオブジェクトコンテキストにアタッチできません」と表示されます。私は "project.ProjectUsers.Add(projectUser)"行の前に "context.AddObject(projectUser)"行を追加します。 – Canam

0

あなたは、このすべての行を必要としないでください。

project.ProjectUsers.Add(projectUser); 

はちょうどあなたが関係を設定しているので、このプロジェクトは、十分なはず加えます。

context.AddObject(project); 
+1

私は本当にその行が必要だと思う...そうでなければ、プロジェクトとProjectUserの間に関係はありません。私はその行がないと関係がどうなるのか分かりません。 – Canam

+0

あなたが正しいです、私はコードを誤解しました。 – Jeff

0

この問題を回避するには、applicationdatabaseコンテキストをsingletonとして実装することをお勧めします。ここではあなたのためのサンプルです:

ここにあなたのApplicationDbContext.cs `javaの

public class ApplicationDbContext : DbContext, IDbContextFactory<DbContext> 
{ 
    protected static ApplicationDbContext _instance { private set; get; } 

    private ApplicationDbContext() : base("ApplicationDbContext") 
    { 
    } 

    public DbContext Create() 
    { 
     return getInstance(); 
    } 


    public static ApplicationDbContext getInstance() 
    { 
     if (_instance == null) { 
      _instance = new ApplicationDbContext(); 
     } 
     return _instance; 
    } 
} 

`

ここにあなたのコントローラは `javaの

private ApplicationDbContext _db; 

public class HelloController : Controller 
{ 
    _db = ApplicationDbContext.getInstance(); 
} 

`

ので、あなたがすることができますまったく同じインスタンスがないmaあなたがあなたの中にいてどこにいるのですか?

0

私はこれが汚れとして古いと知っていますが、今日この役に立たないエラーに何時間も挫折しました。そして、Babacarの答えがついに正しい方向に私を指摘しました。 Ninject管理する依存関係を持つ

のUserManagerと各種コントローラ間の私のEFコールが正常に動作開始する前に、私は

kernel.Bind<Context>().ToSelf().InSingletonScope(); 

を指定する必要がありました。

関連する問題