2012-03-31 15 views
1

私はエンティティフレームワークを新しくしているので、ここでは簡単なものを見落としている可能性があります。エンティティフレームワーク:エンティティAを既存のエンティティBにリンクする

私のコントローラクラスでは、新しいカテゴリエンティティをデータベースに追加しています。次に、そのエンティティをCourseエンティティのプロパティとして使用しています。 Courseエンティティを保存すると、CategoryはデータベースAGAINに保存されますが、新しいCourseがすでに挿入されているCategoryを参照することを期待していました。

最初のカテゴリーを保存する(簡体字)、コントローラコード:

// Create and save the category 
Category category = new Category {Name = "Test category"}; 
category = context.Categories.Add(category); 
context.SaveChanges(); // The category object now has a CategoryId (the pk of the record) 

// Create and save the course 
Course course = new Course { 
    FullDescription = "This is a new course", 
    Name = "My new course", 
    Category = category // Hoping this will have EF make a link to the just inserted category 
}; 

context.Courses.Add(course); 
context.SaveChanges(); // Saves the Course AND creates a **new** Category in the db 

問題は、私は二回()でsaveChangesを呼び出すことのようです。 context.saveChanges()への最初の呼び出しを取り除くと動作しますが、これは私の実際のコードではありません。私のアプリケーションでは、リポジトリパターンを使用し、categoryRepository.AddCategory(カテゴリカテゴリ)を呼び出すことによってカテゴリを追加します。 Courseをセーブするには、saveRange.AddCourse(コースコース)を呼び出して、全く同じ方法でsaveChanges()の呼び出しも含まれています。

public Category AddCategory(Category category) 
    { 
     category = context.Categories.Add(category); 
     context.SaveChanges(); 
     return category; 
    } 

は、私はこれらのアトミック操作になりたいので、AddCourse()とAddCategory()に()でsaveChangesへの呼び出しを削除する必要はありません。

カテゴリを返すと、そのカテゴリを新しいコースのプロパティとして使用すると、そのコースがカテゴリにリンクされていても、それは当てはまりません。どのようにコースをデータベースに既に存在するカテゴリにリンクさせるのですか?

+0

リポジトリ内で別々のコンテキストインスタンスを使用していますか?さもなければあなたのコードは実際に動作します。 – Slauma

答えて

2

あなたのデータモデルがどのように構造化されているかわかりませんが、あなたはこのようなことをすることができます。

course.CategoryId = category.CategoryId; 

このようにして、実際の外部キーを関係にマップし、同じことを行います。

+0

私はコースのカテゴリーを設定せず、CategoryIdだけでこれを解決しました。これは、Hibernate(おそらくNHibernate?)では、このようなCourseIdを持つCategoryを設定したときに、その既存のCategoryにCourseをリンクさせたいと思っているので、これは私にとっては直感的なことです。しかしおそらくこれはEFの仕組みです!ありがとう。 – Julius

0
Category category = new Category {Name = "Test category"}; 
Course course = new Course { 
FullDescription = "This is a new course", 
    Name = "My new course", 
    Category = category 
}; 

courseRepo.AddCourse(course); 

リポジトリのコンテキストが同じ場合は、両方のエンティティを追加するためにAddCourseのみを使用できます。それぞれのリポジトリに独自のコンテキストがある場合は、categoryをcourseRepoコンテキストに追加するか、またはその中にエンティティを読み込む必要があります(ただし、リポジトリが異なるため、適切ではないと思います)。